Соединение: Два файла - но только добавляют последние два столбца

http://www.charvolant.org/~doug/xkb/html/node5.html#SECTION00052000000000000000 имеет карту клавиатуры, и это - символы

5
27.09.2013, 22:56
3 ответа

Я не думаю, что можно сделать это с join один. Вы могли сделать:

join -t, -a1 -a2 -o0,1.2,1.3,1.4,1.5,2.2,2.3,2.4,2.5 -e MISSING 1.txt 2.txt |
  perl -F, -lape '@F[1..2]=@F[5..6] if $F[1] eq "MISSING";
                  $_=join",",@F[0..4],@F[7..8]'
  • -p: используйте линию за линией цикл чтения как в sed/awk
  • -a, -F,: как awk, разделение строки в поля (в @F массив).
  • -l: работы над содержанием строк (работает как awk где вход разделяется на RS ($/) (но RS не включенный в $0) и ORS ($\) добавляется прежде, чем распечатать).
  • -e ...: жемчуг [e] xpression для оценки для каждой строки.
  • Затем это читает почти как английский язык: поля 1 - 2 установлены на поля 5 - 6, если поле 1 (второе поле, поскольку индексы запускаются в 0) "ОТСУТСТВУЕТ". Затем установите содержание текущей записи ($ _ похож на 0$ в awk) к полям от 0 до 4 и 7 - 8.

На самом деле, при записи того же в awk не более сложно:

awk -F, -vOFS=, '$2 == "MISSING"{$2=$6;$3=$7}
                 {print $1,$2,$3,$4,$5,$8,$9}'
8
27.01.2020, 20:33

использование просто awk:

awk -F, -v OFS=, '
    BEGIN {m = " MISSING"}

    # process file1
    NR == FNR {lines[$1] = $0; next} 

    # process file2
    {
        added[$1] = $4 OFS $5
        if (!($1 in lines)) {
            $4 = m
            $5 = m
            lines[$1] = $0
        }
    } 

    # print the combined output
    END {
        for (id in lines) {
            if (!(id in added)) 
                added[id] = m OFS m
            print lines[id], added[id]
        }
    }
' 1.txt 2.txt | sort -n
1, abc, 123, 456, 789, 000, 000
2, lmn, 123, 456, 789, MISSING, MISSING
3, pqr, 123, 456, 789, 000, 000
9, opq, 123, MISSING, MISSING, 000, 000  
5
27.01.2020, 20:33

Звучит так, как будто вы хотите соединить первые три поля. Затем вы должны изменить первые два разделителя, join на новое 1-е поле, а затем восстановить разделители:

join -t, -j1 -a1 -a2 -o 0 1.2 1.3 2.2 2.3 -e " MISSING" \
<(sed 's/, /\x02/;s/, /\x02/' 1.txt) <(sed 's/, /\x02/;s/, /\x02/' 2.txt) \
| sed 's/\x02/, /g'

return

1, abc, 123, 456, 789, 000, 000
2, lmn, 123, 456, 789, MISSING, MISSING
3, pqr, 123, 456, 789, 000, 000
9, opq, 123, MISSING, MISSING, 000, 000
0
27.01.2020, 20:33

Теги

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