并排合并两个.txt文件和数据列

时间:2019-03-22 18:28:11

标签: bash shell unix

我正在尝试将两个文本文件与存储在输出文件merged_file.txt中单独列中的数据合并在一起。

文件_1:

 Temp[K] Time(s) dT
 314.1 1.2 0.4
 317.4 4.2 0.3
 319.9 7.2 0.5

文件_2:

 Temp[K] Time(s) dT
 312.1 1.2 0.2
 315.3 4.2 0.3
 316.7 7.2 0.2

合并文件:

Temp[K] Time(s) dT Temp[K] Time(s) dT
314.1 1.2 0.4 312.1 1.2 0.2

我对Unix和bash shell还是比较陌生,但是我做了一些研究,发现了pastepr。对于paste,我尝试使用定界符' ',但它不起作用。

$ paste -d' ' File_1.txt File_2.txt | column -s $'\t' -t > merged_file.txt 
$ pr -m -t File_1.txt File_2.txt  > merged_file.txt

数据始终存储在彼此之间,在任何情况下都不起作用。

2 个答案:

答案 0 :(得分:0)

您可以使用awk和内置变量FILENAME将每个文件读入数组,然后使用END块并排输出。您可以使用简单的检查if ($0 == "")来检查并丢弃空行。

例如,如果数据位于文件f1f2中,则可以执行以下操作:

awk '
    FILENAME=="f1"{if ($0 != "") a[i++] = $0} 
    FILENAME=="f2"{if ($0 != "") b[j++] = $0} 
    END {for (k = 0; k < i; k++) print a[k], b[k]}' f1 f2

说明

  • FILENAME=="f1"{if ($0 != "") a[i++] = $0},如果文件为f1,并且该行不为空,则将其读入数组a[];
  • 文件f2的同上,但读入b[]数组;
  • END {for (k = 0; k < i; k++) print a[k], b[k]}处理完两个文件中的所有行之后,循环i次,打印a[]b[]数组的内容,并用空格隔开(您可以添加额外检查以确保i == j

使用/输出示例

$ awk '
>     FILENAME=="f1"{if ($0 != "") a[i++] = $0}
>     FILENAME=="f2"{if ($0 != "") b[j++] = $0}
>     END {for (k = 0; k < i; k++) print a[k], b[k]}' f1 f2
Temp[K] Time(s) dT Temp[K] Time(s) dT
314.1 1.2 0.4 312.1 1.2 0.2
317.4 4.2 0.3 315.3 4.2 0.3
319.9 7.2 0.5 316.7 7.2 0.2

答案 1 :(得分:0)

您使用column -s $'\t'。 列的-s选项指定输入文件中使用的定界符。 输入文件中有空格并使用paste -d' '时,请保留默认值。

$ paste -d' ' File_1 File_2 | column -t
Temp[K]  Time(s)  dT   Temp[K]  Time(s)  dT
314.1    1.2      0.4  312.1    1.2      0.2
317.4    4.2      0.3  315.3    4.2      0.3
319.9    7.2      0.5  316.7    7.2      0.2