shell:组合多个表

shell:组合多个表

在同一个工作目录中,我有几个包含相同行数的 2 列表(列之间有 | 分隔符),并共享第一列中的顺序。以下是包含 8 行的两个表的示例:

表1.csv

lig10| -5.4600
lig13| -5.9900
lig14| -4.2200
lig15| -4.9200
lig3| -6.9700
lig4| -7.4000
lig5| -6.0000
lig9| -6.5700

表2.csv

lig10| -5.2400
lig13| -6.6900
lig14| -4.4600
lig15| -4.9600
lig3| -6.9000
lig4| -6.3100
lig5| -3.7900
lig9| -6.5800

我想将所有采用该(非常相似)格式的表并排合并到大表中,获取所有数据,以便生成的表应包含相同的行数,列数与融合的数量成比例菲尔斯。例如,对于 10 个单独的表,它将是 20 列表(注意:我总是采用第一列,即使所有表都相同!)等在结果表中,我想为每个第二列添加标题(初始表),根据初始文件的名称。这是 2 个表的预期输出。

在此输入图像描述

是否可以使用一些 Linux 实用程序在一行命令中融合终端中的表,例如

prog -i /workdir/*.csv  -o resulting_table.csv

答案1

这就是paste目的。不过,您可能需要做一些工作才能获得正确的文件名:

$ ( printf '%s\t' *table*; echo; paste -d'\t' *table*)
name_of_file_with_table1    name_of_file_with_table2    
lig10| -5.4600  lig10| -5.2400
lig13| -5.9900  lig13| -6.6900
lig14| -4.2200  lig14| -4.4600
lig15| -4.9200  lig15| -4.9600
lig3| -6.9700   lig3| -6.9000
lig4| -7.4000   lig4| -6.3100
lig5| -6.0000   lig5| -3.7900
lig9| -6.5700   lig9| -6.5800

如果您只想要第一个文件的第一列,那就更简单了:

$ ( printf '%s ' *table*; echo; join  *table* )
name_of_file_with_table1 name_of_file_with_table2 
lig10| -5.4600 -5.2400
lig13| -5.9900 -6.6900
lig14| -4.2200 -4.4600
lig15| -4.9200 -4.9600
lig3| -6.9700 -6.9000
lig4| -7.4000 -6.3100
lig5| -6.0000 -3.7900
lig9| -6.5700 -6.5800

如果您的文件未排序,您需要先对它们进行排序:

for f in *table*; do sort "$f" > $f.sorted; done

进而:

( printf '%s ' *table*sorted; echo; join  *table*sorted )

相关内容