У меня есть список файла данных 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
Можно использовать 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
)
Я использовал бы 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