合并awk中的类似文件

时间:2014-04-29 12:48:57

标签: awk merge

我有以下文件

档案A

Kmax Event File - Text Format
1 6 1000 
1 4143 9256 13645 16426 20490 
49 4144 8820 14751 16529 20505 
45 4146 8308 12303 16912 22715 
75 4139 9049 14408 16447 20480 
23 4137 8449 13223 16511 20498 
22 4142 8795 14955 16615 20493

档案B

Kmax Event File - Text Format
1 6 1000 
42 4143 9203 13401 16475 20480 
44 4140 8251 12302 16932 21872 
849 6283 8455 12301 16415 20673 
18 4148 8238 12757 16597 20484 
19 4144 8268 12306 17110 21868 
50 4134 8331 12663 16501 20606 
988 5682 8296 12306 16577 20592 
61 4147 8330 12307 16945 22497 
0 4138 8333 12310 16871 22749

文件C 文件D ,...以及所有这些文件具有完全相同的格式。此外,每个文件的文件名如下:runrun%1run%2run%3run%4等。文件编号甚至可以达到到了30,run%30就是。

我想做的是按以下方式合并文件

Kmax Event File - Text Format
1 6 1000 
1 4143 9256 13645 16426 20490 
49 4144 8820 14751 16529 20505 
45 4146 8308 12303 16912 22715 
75 4139 9049 14408 16447 20480 
23 4137 8449 13223 16511 20498 
22 4142 8795 14955 16615 2049
42 4143 9203 13401 16475 20480 
44 4140 8251 12302 16932 21872 
849 6283 8455 12301 16415 20673 
18 4148 8238 12757 16597 20484 
19 4144 8268 12306 17110 21868 
50 4134 8331 12663 16501 20606 
988 5682 8296 12306 16577 20592 
61 4147 8330 12307 16945 22497 
0 4138 8333 12310 16871 22749

我相信我可以使用

来做到这一点
awk '{i=$1;sub(i,x);A[i]=A[i]$0} FILENAME==ARGV[ARGC-1]{print i A[i]}'

但是以这种方式将存在第二个文件的两个第一行。另外我不知道上面这行是否有效。问题是我需要同时合并多个文件。有没有想要合并那些几乎相同的文件?

3 个答案:

答案 0 :(得分:1)

您可以使用cattail

cat A > C && tail -n +3 B >> C

这会将文件A和B合并到一个名为C的新文件中。 使用awk

awk 'FNR==NR{print; next} FNR>2' A B > C

如果要合并多个文件,可以在awk版本的A B旁边列出,例如A B D。 awk版本中的C是包含合并数据的输出文件。

cattail版本中,您可以重复其他文件的tail部分代码,例如

cat A > C && tail -n +3 B >> C && tail -n +3 D >> C

或创建某种循环来迭代文件。

答案 1 :(得分:1)

在shell中使用分组括号

{ cat run; sed '1,2d' run%*; } > c

答案 2 :(得分:0)

打印第一个文件中的所有行(NR == FNR),只打印第3行,然后打开其余文件(FNR> 2):

awk 'NR==FNR||FNR>2' run*