打印文件内容时不包含第一行和最后一行


54

有什么简单的方法可以回显文件,跳过第一行和最后一行?我一直在寻找从head到的管道tail,但对于那些管道,似乎一开始就要知道总的管道。我也在看split,但是我也没有办法做到这一点。

Answers:



36

您不需要事先知道行数。tail并且head可以分别从文件的开头或结尾开始偏移。

该管道从文件的第二行开始(跳过第一行),而在最后一行停止(跳过最后一行)。要在开头或结尾处跳过多行,请相应地调整数字。

tail -n +2 file.txt | head -n -1

当然,反之亦然:

head -n -1 file.txt | tail -n +2

我不知道为什么,但是在Ubuntu 14.04.2LTS上head -n -1删除了.txt文件的第一行和最后一行。
Sopalajo de Arrierez,2015年

9

这是使用以下方法的方法awk

awk 'NR>2 {print t} {t=$0}'

另一种方法是sed

sed '1d;x' file.txt

x是高级sed命令,它将当前行与前一行切换:当前行进入缓冲区,前sed一行进入屏幕,依此类推,同时逐行处理流(这就是第一行为空白的原因)。

awk每个步骤(行)上的解决方案都将当前行放入变量中,并仅在第二行经过后才开始打印出来。因此,我们在屏幕上从第二行到最后一行(除了最后一行)都按顺序排列了几行。由于省略了最后一行,因为该行位于变量中,并且仅应在下一步中打印,但是所有步骤都已用完,我们永远不会在屏幕上看到该行。

的想法相同perl

perl -ne 'print $t if $.>2 ; $t=$_' file.txt

$.代表行号和$_ 当前行。
perl -nwhile(<..>) {..}结构的快捷方式,-e是内联脚本。


2

在python中,我会这样。

#!/usr/bin/python3
import re
import sys
file = sys.argv[1]
with open(file, 'r') as f:
    L = []
    for line in f:
        line = re.sub(r'\n', r'', line)
        L.append(line)
    print('\n'.join(L[1:-1]))

将以上代码粘贴到文件中,并将其命名为script.py。对要检查的文件运行脚本。

python3 script.py /path/to/the/file

例:

$ cat file
foo
apple
banana
bar
$ python3 script.py file
apple
banana

2

对于Mac用户:

在Mac上,head -n -1不起作用。取而代之的是,反转文件,截去第一行,然后反转回来:

tail -r file.txt | tail -n +2 | tail -r

说明:

  1. tail -r :反转其输入中的行顺序

  2. tail -n +2 :从输入的第二行开始打印所有行

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.