объединить строки на основе строки в 2 столбцах 2 файлов

Решение 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
}
0
24.05.2021, 13:50
1 ответ

Использование 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этого не делает ).

Наконец, выходные данные сортируются.

4
28.07.2021, 11:29

Теги

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