Ошибка сравнения файлов – 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 

  • генерировать имена файлов в цикле
  • find -exec exit 1 \; Не работает и не находит -exec sh -c exit 1 \;
  • Выход Capture (sdout / stderr) отправителя SSH-порта
  • Сравните наборы значений из двух файлов и распечатайте вывод в третьем файле с помощью awk
  • mv файл / папка с пробелами в имени не работает - LFTP
  • Извлечение файлов в текущий каталог
  • Как вставить содержимое файла в другой файл перед шаблоном (маркером)?
  • Почему SSH -t не ждет фоновых процессов?
  • 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 - лучшая ОС в мире.