давайте скажем, что у меня есть два файла a.txt, b.txt
a.txt
87621 3bde NDF
87621 2dfg NDF
87621 cdef NDF
87621 abcd NDF
b.txt
93291 abcd NDF
93291 2dfg NDF
93291 adbf NDF
93291 gdrg NDF
Мой сценарий должен создать файл, путем соответствия столбцу 2 обоих файлы и создать файл с соответствующей строкой в новом файле c.txt как ниже
c.txt
2dfg
abcd
Я попробовал несколько опций, но не успешно выполнился, можете Вы помогать!
comm -12 <(awk '{print $2}' a.txt | sort) <(awk '{print $2}' b.txt | sort) > c.txt
<(...)
замена процесса . т.е. выводом команд в эти (...)
заменяют и используют в качестве двух исходных данных к comm
. awk '{print $2}' a.txt
печать только второе поле каждой строки. sort
виды вывод, готовый к входу в comm
. comm
сравнивает два отсортированных файла. -12
флаги подавляют строки, которые уникальны для каждого файла, только печатая общие строки (см. man comm
для получения дополнительной информации). Это читает все строки в a.txt
и отслеживает все его значения столбца 2. Это затем читает b.txt
и распечатывает любые повторные значения столбца 2:
$ awk 'NR==FNR {seen[$2]=1; next} seen[$2]==1 {seen[$2]++; print $2}' a.txt b.txt
abcd
2dfg
awk
команда может быть разделена на эти две части. Первая часть:
NR==FNR {seen[$2]=1; next}
awk
первые тесты, ли общее количество записей обработанные (строки), NR
, совпадает с количеством записей, обработанных в этом файле, FNR
. Это верно только для первого файла, обработанного, который является a.txt
в этом случае. Таким образом, для каждой строки в a.txt
, ассоциативный массив seen
с набором ключей к значению второго столбца, $2
, установлен на значение 1
. Это будет использоваться, чтобы указать, что это значение столбца 2 было "замечено" в a.txt
. Следующая команда next
который говорит awk
чтобы пропустить остальную часть команд и пойти получают следующую запись.
Вторая часть:
seen[$2]==1 {seen[$2]++; print $2}
Из-за next
команда в первой части выше, эта часть только выполняется файлом b.txt
. Эта часть начинается с теста: это проверяет, чтобы видеть если значение столбца 2, $2
, поскольку эта запись была замечена прежде. Если, был замечен прежде однажды, то команды в фигурных скобках выполняются. Первая команда в фигурных скобках, seen[$2]++
увеличивает значение seen
так, чтобы мы никогда не обрабатывали это значение столбца 2 снова. (Следовательно, повторите, что значения столбца 2 проигнорированы.) Вторая команда просто печатает значение столбца 2, который был замечен прежде в a.txt
.
Если мы можем положить, что нет никаких повторных значений для столбца 2, более простой сценарий возможен:
$ awk '{print $2}' a.txt b.txt | sort | uniq -d
2dfg
abcd
Следующая острота жемчуга сделает задание:
perl -lane 'BEGIN{%h}$h{$ARGV."\n".$F[1]}++;END{foreach(keys(%h)){s/.*\n//;$f{$_}++};for(keys(%f)){print if$f{$_}>1}}' a.txt b.txt > c.txt