Решение awk
awk '{if(NF){gsub(/^ |,$/,""); printf c $0; c=","}else{printf "\n"; c=""}};END{printf "\n"}'
дополнен комментариями:
{
if(NF) { # if the line isn't empty
gsub(/^ |,$/,""); # remove the first space and last comma
printf c $0; # print the line (without a newline)
c="," # set c to add a comma for the next field
} else {
printf "\n"; # empty line, output a newline
c="" # don't print a comma for the next entry
}
};
END {
printf "\n" # finish off with a newline
}
Использование GNU awk
и GNU join
, которые являются стандартными для Linux (, может работать или не работать с не -версиями GNU):
$ join -a1 -1 3 -2 2 <(sort -k3,3 file1) <(sort -k2,2 file2) |
awk '$4 == "" { $4 = "-" }; {t=$1; $1=$2; $2=$3; $3=t; print}' |
sort
300 100 a101 b60 uuuuuuuu 344
450 410 a400 -
670 710 a20 -
700 610 a340 b30 tttttttt 456
Команда join
объединяет файл1 и файл2 в полях 3 и 2 соответственно. Он использует подстановку процесса , чтобы убедиться, что оба файла отсортированы по соответствующим ключевым полям. Опция -a 1
используется для того, чтобы распечатать все строки из file1
, даже если они не совпадают со строкой из file2
.
К сожалению, join
помещает ключевое поле файла file1 в начало каждой записи. Это исправлено с помощью awk
, чтобы вернуть поля в их первоначальный порядок, используя переменную с именем t
в качестве временного держателя для значения $1. Сценарий awk также добавляет завершающий символ дефиса в поле $4, если не было совпадения между файлами (, потому что сам join
этого не делает ).
Наконец, выходные данные сортируются.