колотите сравнение файлов линию за линией с выбранной строкой

давайте скажем, что у меня есть два файла 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

Я попробовал несколько опций, но не успешно выполнился, можете Вы помогать!

1
задан 24 March 2014 в 00:54

3 ответа

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 для получения дополнительной информации).
0
ответ дан 11 November 2019 в 12:49

Это читает все строки в 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
1
ответ дан 11 November 2019 в 12:49

Следующая острота жемчуга сделает задание:

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
0
ответ дан 7 December 2019 в 16:45

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

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