найти и распечатать определенную информацию с ее именем

У меня есть список файлов данных 1, которые я хочу найти в файле 2, где я хочу, чтобы grep шаблона соответствия с его именем. Не обязательно, чтобы каждое имя состояло из уникальных данных. Это может быть распространено среди имен.

Файл 1:

123_A7 456_B2 789_f5 111_L2

основной файл:

A Edwin B 777 B 123_A7 B 456_B2 A Alex B 453 B 678 A Marwin B 789 B 123_A7 B 111_L2 B 452

Желаемый выход:

B 123_A7 A Edwin A Marwin B 456_B2 A Edwin B 111_L2 A Marwin
-4
задан 21 September 2017 в 17:40

4 ответа

Я хотел бы использовать awk для этого:

awk 'NR==FNR{seen[$1];next} /^A/{NAME=$0} {for (x in seen){ if ($2==x)print $0"\n"NAME}}' file1 main

Выход:

B 123_A7 A Edwin B 456_B2 A Edwin B 123_A7 A Marwin B 111_L2 A Marwin

Выше - это идентификаторы печати и имя, если его наследование этого идентификатора, но в отдельный. Вот полный скрипт для группировки имен, в которых они находятся в одинаковых идентификаторах.

awk -F'\t' '{a[$1]=a[$1]"\n"$2} END{for (i in a) print i""a[i]}' <( awk 'NR==FNR{seen[$1];next} /^A/{NAME=$0}{for (x in seen){ if ($2==x)print $0"\t"NAME} }' file1 main)

Выход:

B 111_L2 A Marwin B 456_B2 A Edwin B 123_A7 A Edwin A Marwin
0
ответ дан 18 July 2018 в 06:29

Вы можете использовать sed:

sed '/\s/{H;d;} G;s/\nB/#B/g s/^\(.*\)\(\n\n.*#\)\(B\s*\1\)/\3#\2\3/ /^[^#]*\n/d :a;s/^\([^#]*\)\(#.*\n\)\(A[^#]*\)\([^\n]*#\)\1/\1#\3\2/;ta s/#\n.*//;y/#/\n/' main file1

Сначала прочитайте файл main для сбора кодов для каждого имени в пространстве удержания (строка 1). Затем для каждой строки file1 добавьте пространство удержания, замените строки новой строки перед B строками с помощью # для упрощения синтаксического анализа (строка 2) и выполните поиск с обратными ссылками для совпадающих кодов (строка 3). Удалите строки без совпадений (строка 4). Теперь петля собираем имена для данного шаблона (строка 5). Наконец распечатайте оставшееся место удержания и # преобразуйте обратно в новые строки (строка 6). (Примечание: работает только с GNU sed)

1
ответ дан 18 July 2018 в 06:29

Я хотел бы использовать awk для этого:

awk 'NR==FNR{seen[$1];next} /^A/{NAME=$0} {for (x in seen){ if ($2==x)print $0"\n"NAME}}' file1 main

Выход:

B 123_A7 A Edwin B 456_B2 A Edwin B 123_A7 A Marwin B 111_L2 A Marwin

Выше - это идентификаторы печати и имя, если его наследование этого идентификатора, но в отдельный. Вот полный скрипт для группировки имен, в которых они находятся в одинаковых идентификаторах.

awk -F'\t' '{a[$1]=a[$1]"\n"$2} END{for (i in a) print i""a[i]}' <( awk 'NR==FNR{seen[$1];next} /^A/{NAME=$0}{for (x in seen){ if ($2==x)print $0"\t"NAME} }' file1 main)

Выход:

B 111_L2 A Marwin B 456_B2 A Edwin B 123_A7 A Edwin A Marwin
0
ответ дан 24 July 2018 в 18:36
  • 1
    @derHugo в этом случае подсветка синтаксиса бесполезна, так как весь код awk находится внутри строки. – muru 15 November 2017 в 15:34

Вы можете использовать sed:

sed '/\s/{H;d;} G;s/\nB/#B/g s/^\(.*\)\(\n\n.*#\)\(B\s*\1\)/\3#\2\3/ /^[^#]*\n/d :a;s/^\([^#]*\)\(#.*\n\)\(A[^#]*\)\([^\n]*#\)\1/\1#\3\2/;ta s/#\n.*//;y/#/\n/' main file1

Сначала прочитайте файл main для сбора кодов для каждого имени в пространстве удержания (строка 1). Затем для каждой строки file1 добавьте пространство удержания, замените строки новой строки перед B строками с помощью # для упрощения синтаксического анализа (строка 2) и выполните поиск с обратными ссылками для совпадающих кодов (строка 3). Удалите строки без совпадений (строка 4). Теперь петля собираем имена для данного шаблона (строка 5). Наконец распечатайте оставшееся место удержания и # преобразуйте обратно в новые строки (строка 6). (Примечание: работает только с GNU sed)

1
ответ дан 24 July 2018 в 18:36
  • 1
    Очень впечатляет, но не проще ли это с awk? – dessert 21 September 2017 в 14:43
  • 2
    Я давно awk для perl. В настоящее время я выполняю сложные задачи в python, а остальные в sed, для awk нет места. Этого, возможно, будет легче поддерживать в python. Но вы можете предложить версию awk. – Philippos 21 September 2017 в 14:58

Другие вопросы по тегам:

Похожие вопросы: