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