Ошибка сравнения файлов – awk

У меня есть два файла file1.txt , file2.txt . Я хочу выбрать записи, которые являются общими для file1.txt и file2.txt на основе столбца 2 и столбца 3 и скопировать их в out.txt с дополнительным столбцом (столбец 4 из file2.txt ).

Пример ввода:

file1.txt

 abc 1 a f11 f13 f14 abd 2 b f12 f14 f13 abe 4 d f13 f16 f12 acf 5 s f14 f15 f19 

file2.txt

 abc 1 a f21 f23 f24 abd 1 b f21 f24 f23 abe 4 d f24 f26 f22 acf 6 s f23 f25 f29 

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

out.txt

  abc 1 a f11 f13 f14 f21 abe 4 d f13 f16 f12 f24 

Ранее я задал аналогичный вопрос о том, как работать с тремя файлами и извлекать аналогичную информацию на основе аналогичного ввода для лучшего понимания. Я новичок в мире Unix и изучал, как обрабатывать файлы. Исходя из этого, я пробовал использовать код с помощью awk но не работал. Может кто-нибудь, пожалуйста, проверьте и предложите, что пошло не так?

 awk 'FILENAME == ARGV[1] { m[$2,$3] = 0; z[$2,$3] = $6; next; } { if (($2,$3) in m && m[$2,$3] == 1) { print $0 " " z[$2,$3] >"out.txt"; } }' file2.txt file1.txt 

  • Как перемещать файлы во вновь созданный каталог при условии в shell / perl
  • Как извлечь одну папку из большого архива tar.gz?
  • Продолжить мониторинг веб-сервера и загрузить новые добавленные файлы
  • сохранить дубликаты из $ PATH на источнике
  • bash myscript.sh работает в bash, но первая строка: #! / usr / bin / sh
  • CasperJS и PHP In Cron Job не могут открывать файлы, отлично работают при запуске Manualy
  • Редактирование gnome-shell.css не изменяет внешний вид
  • Перечислять дубликаты имен файлов в листинге?
  • 2 Solutions collect form web for “Ошибка сравнения файлов – awk”

    В вашем примере вы создаете массив m со значениями 0. Вы нигде не устанавливаете его в 1, и вам не нужно. Вы можете просто установить значение для всей строки, например $ 0.
    Попробуй это:

     awk 'FILENAME == ARGV[1] { m[$2,$3] = $0; next; } { if (($2,$3) in m) { print m[$2,$3] " " $4 >"out.txt"; } }' file1.txt file2.txt 

    AWK

     awk 'FNR==NR { a[$2, $3]=$4 next } ($2, $3) in a{ print $0, a[$2, $3] } ' file2.txt file1.txt > out.txt 

    присоединиться

     join -j 2 \ <(sort -k2,3 file2.txt | sed 's/ /+/2') \ <(sort -k2,3 file1.txt | sed 's/ /+/2') \ -o 1.1,1.2,1.3,1.4,1.5,2.3 | sed 's/+/ /' > out.txt 
    Linux и Unix - лучшая ОС в мире.