Объедините более 2 файлов таблиц (n файлов) с разделителями табуляции awk - PullRequest
0 голосов
/ 02 октября 2019

Привет, у меня есть более 10 файлов (только два столбца), и я хочу объединить их с именами строк,

file1   
a   3
b   4
c   6

file2   
c   7
b   33
f   56

file3   
d   4
e   9
f   44
a   99

Output          
    file1   file2   file3
a   3   0   99
b   4   33  0
c   6   7   0
e   0   0   9
d   0   0   4
f   0   56  44

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

Объединение нескольких таблиц по именам строк

Как сделать то же самое для нескольких (n) файлов. Новое в командах оболочки

Ответы [ 2 ]

2 голосов
/ 02 октября 2019

С GNU awk для массивов массивов и sorted_in:

$ cat tst.awk
BEGIN { OFS="\t" }
{ vals[$1][ARGIND] = $2 }
END {
    PROCINFO["sorted_in"] = "@ind_str_asc"
    printf "%s", OFS
    for (fileNr=1; fileNr<=ARGIND; fileNr++) {
        printf "%s%s", ARGV[fileNr], (fileNr<ARGIND ? OFS : ORS)
    }
    for (key in vals) {
        printf "%s%s", key, OFS
        for (fileNr=1; fileNr<=ARGIND; fileNr++) {
            printf "%s%s", vals[key][fileNr]+0, (fileNr<ARGIND ? OFS : ORS)
        }
    }
}

$ awk -f tst.awk file1 file2 file3
        file1   file2   file3
a       3       0       99
b       4       33      0
c       6       7       0
d       0       0       4
e       0       0       9
f       0       56      44
1 голос
/ 02 октября 2019

Если входные файлы не отсортированы, необходима явная сортировка. Используя процесс подстановки, оставьте решение простым

#! /bin/sh

# Helper function - join with required parameters
function j {
    join -a1 -a2 -oauto -e0 "$@"
}

echo "file1" "file2" "file3"
j <(sort file1) <(sort file2) | j - <(sort file3)

Вывод:

file1 file2 file3
a 3 0 99
b 4 33 0
c 6 7 0
d 0 0 4
e 0 0 9
f 0 56 44

Или с column -t:

echo "key" "file1" "file2" "file3"
j <(sort file1) <(sort file2) | j - <(sort file3) | column -t
key  file1  file2  file3
a    3      0      99
b    4      33     0
c    6      7      0
d    0      0      4
e    0      0      9
f    0      56     44
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...