Я нашел один способ сделать это, но он все еще довольно запутан для такого простого варианта использования:
echo ${(j:|:)"${(@f)$(print -l *.mp3)}"}
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 .