什么是从文件尾部修剪N行的简单方法(不使用'head')?

时间:2009-01-06 22:38:18

标签: macos unix command-line scripting

假设我有一堆大于100行的文件。我想修剪前14行和后9行,只留下中间的线条。这个命令将削减前十四个:

cat myfile.txt | tail -n +15

是否有其他命令我可以通过修剪底部9而不显式传递文件的长度?

编辑添加:我的头版(Mac OS 10.5)不接受负数行作为参数。

7 个答案:

答案 0 :(得分:14)

这适用于OS X,可能比sed示例更容易理解:

< myfile.txt tail -n +15 | tail -r | tail -n +10 | tail -r

当然,如果您可以使用GNU版本的head,那么它可以更优雅地完成:

< myfile.txt tail -n +15 | head -n -9

请注意tail 在第n行开始,而head 跳过 n行输入。

答案 1 :(得分:4)

您可以使用sed:

sed -n -e :a -e '1,9!{P;N;D;};N;ba' myfile.txt

你也可以使用sed作为前15:

sed '1,15d' myfile.txt

答案 2 :(得分:4)

使用head命令的负数行:

cat myfile.txt | head -n  -9

打印除最后9行之外的所有内容。

答案 3 :(得分:2)

jbourque说完全正确。他对此并不太在意:

cat myfile.txt | tail -n +15 | head -n -9

答案 4 :(得分:2)

如果你能够通过第一行的特殊模式识别最后9行,那么一个简单的sed命令可以解决这个问题:

sed -e '1,15d' -e '/distinctive-pattern/,$d' $file

如果您需要底部的纯数字偏移量,标准(与GNU相对)sed将无济于事,但ed会:

ed $file <<'!'
1,15d
$-8,$d
w
q
!

这会覆盖原始文件。如果你想避免这种情况,你必须编写文件写入的脚本。

答案 5 :(得分:0)

这也应该有效,并在一个过程中完成:

seq 15 | 
awk -v N=5 '
  { lines[NR % N] = $0 } 
  END { i = NR-N+1; if (i<0) i=0; for (; i <= NR; ++i) print lines[i % N] }'

seq只是生成一些测试数据的简便方法。)

答案 6 :(得分:-1)

head命令应该做你想要的。它就像tail一样,但是从文件的另一端开始。