假设我有一堆大于100行的文件。我想修剪前14行和后9行,只留下中间的线条。这个命令将削减前十四个:
cat myfile.txt | tail -n +15
是否有其他命令我可以通过修剪底部9而不显式传递文件的长度?
编辑添加:我的头版(Mac OS 10.5)不接受负数行作为参数。
答案 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
一样,但是从文件的另一端开始。