如何相互捕获两个文件但分别省略最后一行?

时间:2010-08-30 12:11:56

标签: bash line text-files

我有两个我想要在一起的文件。但是,应省略第一个文件的最后一行和最后一个文件的第一行。

我确信这可以在UNIX shell(或者更确切地说,Cygwin)中完成。但是如何?

7 个答案:

答案 0 :(得分:15)

$ head --lines=-1 file1 > res
$ tail --lines=+2 file2 >> res

答案 1 :(得分:3)

你可以使用:

head -n -1 file1 && tail -n +2 file2

head显示文件的第一行,param -n显示文件的前n行,但是如果你在数字前加上 - ,则显示除最后n行之外的所有文件。

尾巴是模拟的..

以便更好地参考:

man head

man tail

答案 2 :(得分:2)

head -n -1 file1

将打印file1中除最后一行之外的所有行。

tail -n +2 file2

将打印file2中除第一行以外的所有行。

将两者合并为:

head -n -1 file1 ; tail -n +2 file2

答案 3 :(得分:2)

awk 'FNR>2{print p}{p=$0}' file1 file2

按要求说明:

FNR是当前正在处理的文件的当前记录号。 在每次迭代开始时,该行存储在“p”变量中,但尚未打印出来。当记录号达到3时,打印出变量“p”,其中包含记录2.这意味着第2行。当awk到达文件末尾时,最后一行不打印出来然后转到下一个文件。

答案 4 :(得分:1)

以下成绩单显示了如何实现这一目标:

pax> cat file1.txt
1.1
1.2
1.3
1.4
1.5

pax> cat file2.txt
2.1
2.2
2.3
2.4
2.5

pax> head --lines=-1 file1.txt ; tail --lines=+2 file2.txt
1.1
1.2
1.3
1.4
2.2
2.3
2.4
2.5

head命令一个负数,直到结束。同样,以+开头的计数会导致tail从该行开始,而不是从末尾开始一定数量的行。

答案 5 :(得分:1)

我无法在Mac上使用以下命令(更具体地说,在Mac OS X 10.7.5上的终端窗口中运行的bash shell中):

head -n -1 file1

上面的命令会生成以下错误消息:

head: illegal line count -- -1

在Mac OS X版本的head中,不接受-n参数的负值。但是,您可以改用sed:

sed -e '$d' file1

[“tail -n +2 file2”似乎在Mac OS X上如上所述工作]

答案 6 :(得分:1)

我经常使用sed进行头尾动作:

{ sed '$d' file1; sed '1d' file2; } > combined