Объединение аналогичных столбцов из разных файлов в матрицу

63
7

У меня есть файлы со следующим форматом, каждый из которых имеет первый столбец, который является общим среди всех файлов:

  File1.txt
ID Score
ABCD 0.9
BCBS 0.2
NBNC 0.67
TCGS 0.8

File2.txt
ID Score
ABCD 0.3
BCBS 0.9
NBNC 0.73
TCGS 0.12

File3.txt
ID Score
ABCD 0.23
BCBS 0.65
NBNC 0.94
TCGS 0.56

Я хочу объединить второй столбец (столбец) всех файлов с первым общим столбцом и отобразить имя файла за вычетом расширения каждого файла в качестве заголовка, чтобы определить, откуда взялась оценка, так что матрица посмотреть что-то вроде

   ID     File1  File2 File3
ABCD 0.9 0.3 0.23
BCBS 0.2 0.9 0.65
NBNC 0.67 0.73 0.94
TCGS 0.8 0.12 0.56

спросил(а) 2021-01-25T21:08:55+03:00 4 месяца, 2 недели назад
1
Решение
98

$ cat tst.awk
BEGIN { OFS="\t" }
FNR>1 { id[FNR] = $1; score[FNR,ARGIND] = $2 }
END {
printf "%s%s", "ID", OFS
for (colNr=1; colNr<=ARGIND; colNr++) {
sub(/\..*/,"",ARGV[colNr])
printf "%s%s", ARGV[colNr], (colNr<ARGIND?OFS:ORS)
}
for (rowNr=2; rowNr<=FNR; rowNr++) {
printf "%s%s", id[rowNr], OFS
for (colNr=1; colNr<=ARGIND; colNr++) {
printf "%s%s", score[rowNr,colNr], (colNr<ARGIND?OFS:ORS)
}
}
}

$ awk -f tst.awk File1.txt File2.txt File3.txt
ID File1 File2 File3
ABCD 0.9 0.3 0.23
BCBS 0.2 0.9 0.65
NBNC 0.67 0.73 0.94
TCGS 0.8 0.12 0.56

Выберите строку, которая не может возникнуть на вашем входе в качестве OFS, я использовал вкладку.

Если у вас нет GNU awk, добавьте FNR==1{ ARGIND++ } в начале скрипта.

ответил(а) 2021-01-25T21:08:55+03:00 4 месяца, 2 недели назад
88

Другая альтернатива

$ awk 'NR==1{$0=$1"\t"FILENAME}1' File1 > all; 
for f in File{2..6};
do
paste all <(p $f) > temp && cp temp all;
done

определить функцию p как

p() { awk 'NR==1{print FILENAME;next} {print $2}' $1; }

Я скопировал ваши данные в 6 идентичных файлов File1..File6, и скрипт подготовил это. Большая часть работы - это создание имен столбцов

ID      File1   File2   File3   File4   File5   File6
ABCD 0.9 0.9 0.9 0.9 0.9 0.9
BCBS 0.2 0.2 0.2 0.2 0.2 0.2
NBNC 0.67 0.67 0.67 0.67 0.67 0.67
TCGS 0.8 0.8 0.8 0.8 0.8 0.8

ответил(а) 2021-01-25T21:08:55+03:00 4 месяца, 2 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема