Я принимаю T1, T2 являются названиями четырех входных файлов:
Используя awk:
awk 'FNR==1 { header = header " " FILENAME;
next # we want to skip the first line
}
{ rows[$1]; for(i=2;i<=NF;i++) A[$1,i] = A[$1,i] " " $i }
END { for(i=2;i<=5;i++) {
printf("__%s\n", header);
for(j in rows) printf("%s%s\n", j, A[j,i]);
}
}' T1 T2 T3 T4
Это только создает единственный выходной файл со всеми Вашими желаемыми связанными таблицами. Если Вы хотите разделить его на четыре файла, необходимо будет сделать больше работы.
Если Вы хотите извлечь строки заголовка из первой строки, а не названия входных файлов, замены FILENAME
с $0
.
Вы можете использовать однострочный цикл следующим образом:
for f in file1 file2 file3; do sed -i "s/$/\t$f/" $f; done
Для каждого файла в списке будет использоваться sed
для добавления в конец каждой строки табуляции и имени файла.
Объяснение:
-i
с sed
для выполнения замены на месте, перезаписывая файлs/PATTERN/REPLACEMENT/
. В этом примере PATTERN - это $
, конец строки, а REPLACEMENT - \t
(= табуляция), а $f
- имя файла из переменной цикла. Команда s///
заключена в двойные кавычки, чтобы оболочка могла расширить переменные. Ну почему вы, ребята, рекомендуете эти мощные инструменты, когда есть команда paste
!
$ cat a
A
B
C
D
$ cat b
1
2
3
4
$ paste a b
A 1
B 2
C 3
D 4
С помощью небольшой хитрости, вы можете использовать paste
для цели OP. Однако это не заменит файлы на месте:
for f in file1 file2 file3; do
paste $f <(yes $f | head -n $(cat $f | wc -l)) > $f.new
done
Это вставит соответствующее имя файла в качестве последнего столбца каждого файла в новый файл filename.new
Вы можете использовать awk
:
awk '{print $0, FILENAME}' file1 file2 file3 ...