2017-02-17 3 views
0

У меня есть два файла file1.txt и file2.txt.Сравните два файла и напечатайте соответствующие строки с некоторыми строками после соответствия

file1.txt

DS496218 40654 42783 
DS496218 40654 42783 
DS496218 40654 42783 

file2.txt

### 
DS496108 ena gene 99942 102567 . -  
DS496128 ena mRNA 99942 102567 . -  
DS496118 ena three_prime_UTR 99942 100571 
### 
DS496218 ena gene 40654 42783 . -  
DS496108 ena mRNA 99942 102567 . -  
DS496108 ena three_prime_UTR 99942 100571  
### 
DS496128 ena gene 99942 102567 . -  
DS496133 ena mRNA 99942 102567 . -  
DS496139 ena three_prime_UTR 99942 100571 
### 

Я хочу, чтобы соответствовать колонки 1,2 и 3 file1.txt с колонки 1,4 и 5 file2.txt. Если он соответствует печати соответствующей строки со следующими строками до ###, но не печатайте ###. Я попробовал его с помощью команды «AWK» в

awk -F'\t' 'NR==FNR{c[$1$2$3]++;next};c[$1$4$5] > 0' file1.txt file2.txt > out.txt. 
+0

Попробуйте использовать опцию «в». то есть: $ 1 $ 4 $ 5 в c {do stuff here} – grail

+1

попробуйте с 'awk 'NR == FNR {c [$ 1 $ 2 $ 3] ++; next} $ 1 $ 4 $ 5 в c 'file1.txt RS = "###" file2.txt' –

+1

[изменить] ваш вопрос включить ожидаемый результат с учетом ввода. @JoseRicardoBustosM. no, никогда не объединяйте поля для создания ключевой строки, если у вас нет очень конкретной цели, так как это создает ложные совпадения - рассмотрите 'a bc' ->' abc' и 'ab c' ->' abc'. Кроме того, установка RS на несколько символов сделает скрипт ненужным gawk-specific и будет печатать строки до матча, а также после. –

ответ

0

не видя ожидаемого результата это предположение, но это звучит, как это то, что вы хотите:

awk ' 
NR==FNR { a[$1,$2,$3]; next } 
($1,$4,$5) in a { found=1 } 
/^###/ { found=0 } 
found 
' file1 file2 
+1

Его работы. благодаря –