如何将输出添加为带有文件名的新列

如何将输出添加为带有文件名的新列

如何在一个输出中增量添加每个文件的输出?我想这样做,而不是对所有文件一起运行粘贴命令。这是因为我有 10k 个文件,每个文件大小为 100 GB。

文件1

a       1
b       2
c       3

文件2

a       10
b       20
c       40

文件3

a       0
b       0
c       0

所需输出

file1   file1   file2   file2   file3   file3
a       1       a       10      a       0
b       2       b       20      b       0
c       3       c       40      c       0

我知道我可以得到一些类似于所需输出的东西paste -d "\t" file{1..3},但我想一个接一个地执行操作,但不是全部一起执行,重要的是我想保留文件名。

答案1

paste如果我们只需要合并文件行,命令是一个不错的选择。

前置标头行与文件名使用组合awk+粘贴

{ for f in file*; do awk '{ for(i=1;i<=NF;i++) printf("%s\t",FILENAME); exit }' "$f"; done; 
echo ""; paste -d"\t" file*; } | column -t

输出(对于 3 个输入文件):

file1  file1  file2  file2  file3  file3
a      1      a      10     a      0
b      2      b      20     b      0
c      3      c      40     c      0

细节:

  • { command; command; ...}- 用于组合多个命令的输出

  • for f in file*;- 对于每个文件

  • printf("%s\t",FILENAME)- 打印相应文件每一列的文件名

  • exit- 处理完第一行后立即退出

相关内容