在同一个工作目录中,我有几个包含相同行数的 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 )