Поиск в файле строки в первом поле в зависимости от ввода из другого файла и передача результата в новый файл

У меня есть входной файл, как показано ниже

 Model related text
 Model specifications
 *ELEMENT_SHELL
 $#   eid     pid   n1   n2   n3   n4   n5   n6      n7    n8
 76737    1    79322  79323   79324   79511     0       0       0       0
 76738    1   79510   79203   79204   79512     0       0       0       0
 76739    1   79511   79324   79325   79513     0       0       0       0
 76740    1   79512   79204   79205   79514     0       0       0       0
 76741    1   79514   79205   79206   79515     0       0       0       0
 76742    1   79515   79206   79207   79516     0       0       0       0
 76743    1   79516   79207   79208   79517     0       0       0       0
 76744    1   79517   79208   79209   79518     0       0       0       0
 76745    1   79518   79209   79210   79519     0       0       0       0
 76746    1   79519   79210   79211   79520     0       0       0       0

В другом файле File 2 у меня есть только такие числа, как

 76737    
 76738    
 76739    
 76740    
 76741

Я должен сравнить эти числа из File2.txt с числами в первой строке File1.txt, и если они совпадают, полная строка из File1.txt будет выводиться в model.txt. Результат будет

 Model related text
 Model specifications
 *ELEMENT_SHELL
 $#   eid     pid   n1   n2   n3   n4   n5   n6      n7    n8
 76737    1    79322  79323   79324   79511     0       0       0       0
 76738    1   79510   79203   79204   79512     0       0       0       0
 76739    1   79511   79324   79325   79513     0       0       0       0
 76740    1   79512   79204   79205   79514     0       0       0       0
 76741    1   79514   79205   79206   79515     0       0       0       0

может ли кто-нибудь предложить мне AWK, SED и т. д.?


person hamad hassan    schedule 09.02.2015    source источник
comment
Исследуйте с помощью соединения...   -  person Partha Lal    schedule 09.02.2015
comment
на самом деле я пытался сравнить первое FIELD со всеми строками и попытаться передать его в новый файл, но я думаю, что мне не хватает синтаксиса, и я хочу получить подтверждение от экспертов.   -  person hamad hassan    schedule 09.02.2015


Ответы (1)


Это можно очень легко сделать с помощью awk

awk 'FNR==NR{ value[$1]; next} $1 in value || FNR < 5' 

Тест

$ awk 'FNR==NR{ value[$1]; next} $1 in value || FNR < 5' file2 file1
Model related text
Model specifications
*ELEMENT_SHELL
$#   eid     pid   n1   n2   n3   n4   n5   n6      n7    n8
76737    1    79322  79323   79324   79511     0       0       0       0
76738    1   79510   79203   79204   79512     0       0       0       0
76739    1   79511   79324   79325   79513     0       0       0       0
76740    1   79512   79204   79205   79514     0       0       0       0
76741    1   79514   79205   79206   79515     0       0       0       0

Если вас не интересуют начальные заголовки в выводе, сценарий можно еще больше упростить:

awk 'FNR==NR{ value[$1]; next} $1 in value' file2 file1
76737    1    79322  79323   79324   79511     0       0       0       0
76738    1   79510   79203   79204   79512     0       0       0       0
76739    1   79511   79324   79325   79513     0       0       0       0
76740    1   79512   79204   79205   79514     0       0       0       0
76741    1   79514   79205   79206   79515     0       0       0       0

Что он делает?

  • FNR==NR Проверяет, равно ли количество прочитанных записей из текущего файла общему количеству прочитанных записей. В основном это оценивает true только для первого файла, то есть здесь для file2

  • value[$1]; next Создает ассоциативный массив, индексированный $1, значением из file2

  • $1 in value проверяет, присутствует ли столбец 1 в ассоциативном массиве


ИЗМЕНИТЬ

Печатать только первое вхождение.

Вы можете использовать delete для удаления записи из ассоциативного массива после того, как строка будет напечатана. Это гарантирует, что строка не будет напечатана для второго вхождения.

awk 'FNR==NR{ value[$1]; next} $1 in value{ print; delete value[$1] }' 
person nu11p01n73R    schedule 09.02.2015
comment
можно ли ограничить вывод только первым совпадением? Я имею в виду, если определенное число появляется два раза, тогда следует учитывать только первую запись? Я только что видел, что в моем файле длиной 10000 строк идентификатор появляется два раза, и второе появление также отображается в моем результате. Можем ли мы с этим справиться? - person hamad hassan; 09.02.2015
comment
@hamadhassan Да, это возможно. см. редактирование. Надеюсь, это поможет вам. - person nu11p01n73R; 09.02.2015