通过排除第二个和第三个文件中的标头,将三个文件合并到一个主文件中


8

我有三个文件,行数为n,如下所示

sample1.txt

------------------------------
Date        Time    Name    
------------------------------
2013/10/12  12:09:09    Krish
2013/10/12  13:12:01    Ramb
2013/10/12  15:28:39    Likha
2013/10/12  15:56:12    Mat
.
.
.

Sample2.txt

------------------------------
Date        Time    Name    
------------------------------
2013/10/12  11:19:21    Jack
2013/10/12  12:11:09    Rob
2013/10/12  15:45:12    Rick
2013/10/12  22:11:10    Phil
.
.
.

Sample3.txt

------------------------------
Date        Time    Name    
------------------------------
2013/10/12  12:09:09    Eric
2013/10/12  13:12:01    Bob
2013/10/12  15:28:39    Mike
2013/10/12  15:56:12    Nick
.
.
.

我需要通过排除Sample2.txt和Sample3.txt中的标题(前3行)来将这三个文件合并到单个文件(Master.txt)中,如下所示

期望的输出

$cat Master.txt

------------------------------
Date        Time    Name    
------------------------------
2013/10/12  12:09:09    Krish
2013/10/12  13:12:01    Ramb
2013/10/12  15:28:39    Likha
2013/10/12  15:56:12    Mat
2013/10/12  11:19:21    Jack
2013/10/12  12:11:09    Rob
2013/10/12  15:45:12    Rick
2013/10/12  22:11:10    Phil
2013/10/12  12:09:09    Eric
2013/10/12  13:12:01    Bob
2013/10/12  15:28:39    Mike
2013/10/12  15:56:12    Nick

注意:在带有Ksh 88的AIX机器中


4
这可能最好以编程方式完成。可能使用Python和Perl。如果您经常执行此类操作,则可以考虑使用R。R允许您将各个文件作为数据框导入,然后可以将数据框合并在一起。我相信例如Python的熊猫提供了类似的功能,但是我没有使用过。
Faheem Mitha 2013年

@FaheemMitha Perl / Python对此肯定是矫kill过正。另外,在AIX上使用Python可能会出现一些问题。
彼得

@peterph好吧,也许吧。但是,如果他必须经常进行此类操作,则R方法值得推荐。尽管我不了解R在AIX上的当前状态。尽管几乎任何年份的R都应该能够进行此类操作。
Faheem Mitha 2013年

1
@FaheemMitha为什么在地球上您会为此推荐R?OP所需要的就是从第一个文件中除去所有最上面的3行。给定UNIX基于严格文本的界面,它适用于标准实用程序。
彼得

1
@peterph好吧,这种特殊的操作不是必需的,但是似乎发帖者需要操作文本表,通常R是一种很好的操作方式,并且可以更好地扩展到更复杂的情况。使用unix工具的替代方法当然是可行的。我并不是说这是一个糟糕的路要走。
Faheem Mitha 2013年

Answers:


18
{ cat sample1.txt; tail -n +4 sample2.txt; tail -n +4 sample3.txt; } > out.txt

@Stephane Chazelas:对先前的评论表示遗憾。谢谢,它可以按预期正常工作.. !!!
2013年

1
@ram tail -n +4表示无论文件大小如何,前三行均被排除。我只是用10行国际剑联尝试过。不要在样本中有4行的情况下混淆“ 4”。这基本上是巧合。
Michael Durrant

@ram :)出于完整性考虑,head有一个类似的选项:-n -X将打印除最后 X一行以外的所有内容。
彼得

2
@peterph,而不是在AIX,不是在POSIX规范(仅正数允许)
斯特凡Chazelas

嗯,我不好...这是GNU扩展。
彼得

7
sed '4,${/^---/d;/^Date/d;}' sample1.txt sample2.txt sample3.txt > out.txt

2
+1,但您可以补充一点说明吗?什么是${}语法做sed
terdon

那不是${},而是“ {...}在第4行上执行到最后”;它将删除匹配的行,但仅在第一个标头消失之后。但是,使用tail更通用,更可靠。
Alexis

就像@terdon所说的,{}是命令的分组。
彼得2013年

@alexis最终取决于您想要什么。优点之一(尽管现在不那么重要)是它仅产生一个进程。另外,您只要#!/bin/sed是解释器,就可以轻松地使其成为脚本。
彼得
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.