Объединение нескольких столбцов из разных файлов с помощью awk

Пробовал с помощью приведенной ниже команды и работал нормально

for i in 5; do sed -i ''$i'i subject '$i'' file1;j=$(($i+1)); sed -i  ''$i'i subject '$j'' file2;k=$(($j+1)); sed -i ''$i'i subject '$k' ' file3;l=$(($k+1));sed -i ''$i'i subject '$l'' file4;m=$(($l+1)); sed -i ''$i'i subject '$m'' file5;done
5
11.04.2020, 17:56
3 ответа
$ cat tst.awk
BEGIN { FS=OFS="\t" }
{ datasets[$1]; fnames[FILENAME]; vals[$1,FILENAME] = $2 }
END {
    printf "%s", "dataset"
    for (fname in fnames) {
        printf "%s%s", OFS, fname
    }
    print ""
    for (dataset in datasets) {
        printf "%s", dataset
        for (fname in fnames) {
            printf "%s%s", OFS, vals[dataset,fname]
        }
        print ""
    }
}

$ tail -n +1 file?
==> file1 <==
a       1
b       2
c       3

==> file2 <==
a       2
c       3

$ awk -f tst.awk file1 file2
dataset file1   file2
a       1       2
b       2
c       3       3

Добавьте в список столько файлов, сколько хотите.

7
28.04.2021, 23:18

Совет на данный момент :код на потом, если понадобится.

Я бы оставил три массива, когда вы читаете все файлы.

(a )Для каждого нового файла хэш-список имен файлов.
(b )Для каждого нового набора данных хэш-список из $1.
(c )Для каждой строки хэш-список значений

FNR == 1 { ++htFile[FILENAME]; }
! ($1 in htSet) { ++htSet[$1]; }
{ htVal [FILENAME, $1] = $2; }

В функции End выполните итерацию по htFile и htSet.

function Table (r, c, buf) {
    buf = "dataset";
    for (c in htFile)
        buf = sprint ("%s\t%s", buf, htFile[c]);
    print buf;
    for (r in htSet) {
        buf = "";
        for (c in htFile)
            buf = sprint ("%s\t%s", buf, htVal[c, r]);
        print substr (buf, 2);
    }
}
END { Table( ); }

Это не поддерживает порядок файлов и наборов данных в выходной таблице. Если это имеет значение, вы можете сохранить упорядоченную версию таблиц и выполнять итерации в исходном порядке.

0
28.04.2021, 23:18

С join (GNU coreutils) 8.30и "подстановкой процесса" вы можете попробовать

join -a1 -a2 -t"    " -oauto  -e " " <(join -a1 -a2 -t" " -oauto  -e "" file[12]) <(join -a1 -a2 -t"    " -oauto  -e " " file[34])
abc 1   2        
def 2       1    
ghi 3   3   2   3
jkl         4   4

Опции -tимеют символьное значение <TAB>.

2
28.04.2021, 23:18

Теги

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