2015-02-09 5 views
0

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

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 

В другом файл Файл 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 и т. Д.?

+0

Исследовать с помощью присоединиться ... –

+0

на самом деле я пытался сравнить первое поле со всеми линиями и попытаться> трубой его в новый файл, но я предполагаю, что я не хватаю какой синтаксис вещи и хочу, чтобы подтвердить от экспертов. –

ответ

3

Это может быть очень легко сделать с помощью 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 Проверяет, является ли число записей, считываемых из текущего файла равно общее количество записей чтения. В основном это оценивает справедливо только для первого файла, то есть здесь file2

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

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


EDIT

Печать только первое появление.

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

awk 'FNR==NR{ value[$1]; next} $1 in value{ print; delete value[$1] }' 
+0

Можно ли ограничивать вывод только первым совпадением? Я имею в виду, если определенное число появляется два раза, тогда следует учитывать только первую запись? Я только что видел, что в моем файле длиной 10000 строк идентификатор появляется два раза, а второе появление также появляется в моем результате. Можем ли мы обрисовать это? –

+0

@hamadhassan Да, это возможно. см. редактирование.Надеюсь, это поможет вам. – nu11p01n73R

+0

он работал достаточно хорошо –

 Смежные вопросы

  • Нет связанных вопросов^_^