如何获得“tail”和“head”的逆行为?

如何获得“tail”和“head”的逆行为?

有没有办法head/ taila 文档并获得反向输出;因为你不知道文档中有多少行?

即我只想将除前两行之外的所有内容foo.txt附加到另一个文档。

答案1

您可以使用它来剥离第一的两行:

tail -n +3 foo.txt

这是为了剥离最后的两行,如果您的实现head支持它:

head -n -2 foo.txt

(假设文件\n以后者结尾)


就像 的标准用法一样tailhead这些操作不是破坏性的。>out.txt如果要将输出重定向到某个新文件,请使用:

tail -n +3 foo.txt >out.txt

如果out.txt已经存在,则会覆盖该文件。>>out.txt如果>out.txt您希望将输出附加out.txt到.

答案2

如果您想要除前 N-1 行之外的所有行,请tail使用 number oflines进行调用+N。 (数字是你要保留的第一行的行号,从1开始,即+1表示从顶部开始,+2表示跳过一行,依此类推)。

tail -n +3 foo.txt >>other-document

没有简单、可移植的方法来跳过最后 N 行。 GNUhead允许head -n +N作为tail -n +N.否则,如果你有tac(例如GNU或Busybox),你可以将它与tail结合起来:

tac | tail -n +3 | tac

可移植的是,您可以使用 awk 过滤器(未经测试):

awk -vskip=2 '{
    lines[NR] = $0;
    if (NR > skip) print lines[NR-skip];
    delete lines[NR-skip];
}'

如果要从大文件中删除最后几行,可以确定要截断的部分的字节偏移量,然后使用 执行截断dd

total=$(wc -c < /file/to/truncate)
chop=$(tail -n 42 /file/to/truncate | wc -c)
dd if=/dev/null of=/file/to/truncate seek=1 bs="$((total-chop))"

您无法从一开始就截断文件,但如果您需要删除大文件的前几行,您可以移动内容

答案3

要删除前 n 行,可以使用 GNU sed。例如,如果 n = 2

sed -n '1,2!p' input-file

意思!是“排除这个区间”。正如你可以想象的,可以获得更复杂的结果,例如

sed -n '3,5p;7p'

将显示第 3,4,5,7 行。更强大的功能来自于使用正则表达式而不是地址。

限制是必须提前知道行号。

答案4

{   head -n2 >/dev/null
    cat  >> other_document
}   <infile

如果<infile是一个常规的,lseek()-able 文件,那么是的,无论如何,随意。以上是完全 POSIX 支持的构造。

相关内容