2016-03-30 2 views
-2

У меня есть два файла, которые имеют несколько общих линий.Как получить общие линии между двумя файлами с помощью awk

file1 имеет значения, разделенные символом ";"

20160301 000000;0.713290;0 
20160301 000001;0.713270;0 
20160301 000003;0.713280;0 
20160301 000005;0.713270;0 
20160301 000006;0.713280;0 
20160301 000010;0.713250;0 
20160301 000011;0.713260;0 
20160301 000012;0.713260;0 
20160301 000013;0.713260;0 
... 

file2:

20160301 000000 
20160301 000001 
20160301 000003 

Желаемый результат:

20160301 000000;0.713290;0 
20160301 000001;0.713270;0 
20160301 000003;0.713280;0 

я пытался grep -f но я взял много времени, чтобы выполнить, так как оба файла (file1 & файл 2) огромны , я ищу альтернативу с помощью awk

ответ

1
awk -F';' 'NR==FNR{a[$0];next} $1 in a' file2 file1 

Учитывая ваш новый вход, где file2 линии могут иметь замыкающие пустые символы:

$ tr ' ' '#' < file1 
20160301#000000;0.713290;0 
20160301#000001;0.713270;0 
20160301#000003;0.713280;0 
20160301#000005;0.713270;0 
20160301#000006;0.713280;0 
20160301#000010;0.713250;0 
20160301#000011;0.713260;0 
20160301#000012;0.713260;0 
20160301#000013;0.713260;0 
... 

$ tr ' ' '#' < file2 
20160301#000000## 
20160301#000001## 
20160301#000003 

$ awk -F';' 'NR==FNR{sub(/ +$/,""); a[$0];next} $1 in a' file2 file1 
20160301 000000;0.713290;0 
20160301 000001;0.713270;0 
20160301 000003;0.713280;0 
+0

спасибо за ответ, но не работает, может быть, я забыл упомянуть, что мой Fisrt колонка actualy не 1,2,3, но это 1 1, 1 2, 1 3. (первый столбец содержит пробелы). – aachraf

+0

да, это не сработало, выходной файл пуст. Извините, я просто упоминаю, что мой первый столбец не является описанием (я редактирую свой вопрос). – aachraf

+0

Я редактирую свой вопрос с точными входными файлами. – aachraf

0

может быть:

awk 'NR==FNR{A[$1];next}$1 in A' file2 file1 

Это непроверенное и Я нахожусь в своей камере, поэтому извиняюсь, если это не то, что вы хотите :)

+0

спасибо за ответ, но не сработал, возможно, я забыл упомянуть, что моя колонка fisrt актуальна не 1,2,3, а это 1 1, 1 2, 1 3. (сначала столбец содержит пробелы) – aachraf

+0

Решение hsa уже опубликовано ** http: //stackoverflow.com/questions/12730800/awk-matching-between-two-files-when-regions-intersect-any-solutions-welcome** –

+0

@ ArifBurhan, что Q/A намного сложнее и имеет очень мало общего с этим Q/A, за исключением того, что он включает в себя 2 файла. –

1

Если файлы уже отсортированы в ключевом поле (как в вашем случае)

$ join -t';' file1 file2 
1 1;adc;01 
2 2;efg;02 
3 3;hij;03 

это типичный случай для join команды. Если не сортируется вы можете передать отсортирован выходы

$ $ join -t';' <(sort file1) <(sort file2) 
Смежные вопросы