Объединение двух текстовых файлов с помощью AWK

Я нашел один способ сделать это, но он все еще довольно запутан для такого простого варианта использования:

echo ${(j:|:)"${(@f)$(print -l *.mp3)}"}

0
29.10.2021, 17:05
1 ответ
awk '!second { file1vals[$1 FS $2]=$0 }
      second { print (($1 FS $2 in file1vals)?file1vals[$1 FS $2]: $1 FS $2 FS "0 0 0 0") FS $3, $4, $5, $6;
               delete file1vals[$1 FS $2]
             }
END{ for(x in file1vals) print file1vals[x], "0 0 0 0" }' file1 second=1 file2

это будет работать до тех пор, пока памяти достаточно для загрузки первого файла1 в память.

В первом блоке !second {...}, который выполняется только тогда, когда это первый файл, и мы загружаем файл1 в связанный массив на пару 1 st &2 и столбцы в качестве ключей для массива.

Во втором блоке second {...}, который выполняется только тогда, когда это второй файл, мы печатаем объединенные строки, которые имеют совпадающие ключи в обоих файлах, в противном случае мы печатаем ключи и нули, за которыми следуют остальные столбцы из файл2 ; затем мы также удаляем ключи из массива с delete file1vals[$1 FS $2], чьи ключи существуют в обоих файлах.

В последнем блоке в КОНЦЕ мы печатаем оставшиеся не -совпадающие ключи, относящиеся к файлу1 .

1
29.10.2021, 18:18

Теги

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