2013-04-20 63 views
1

所以我有一个文件,我想剪掉它的前33行和最后6行。我想要做的是在cat命令(cat文件)中获取整个文件,然后使用“head”和“tail”命令删除这些部分,但我不知道如何去做。 EG(这只是想法)Shell脚本剪切文件的开头和结尾

cat file - head -n 33 file - tail -n 6 file 

我应该怎么做呢?是否有可能用“sed”(如何)做到这一点?提前致谢。

+1

您可以删除第33行用'sed'足够容易:'sed的“1, 33d'文件'。 “sed”不能做的是从最后一行(或当前行)向后计数,所以'最后6行'部分不能用'sed'明智地解决。 (你可以通过握持空间和图案空间进行非凡的旋转,但是为了你的理智,不要去探索它们。) – 2013-04-21 00:00:42

+0

@JonathanLeffler它已经被'sed'回答了,没有使用保持空间。但是,我明白你的观点。 – 2013-04-21 00:10:26

+1

@StevenPenny:我没有在思想上做过'sed'脚本,是的,有一个解决方案适用于33和6的情况,只有模式空间(所以我过分复杂)。然而,推广这个解决方案来处理25和20将是'sed'脚本生成中的一个混乱的练习,并且处理200和250不会考虑。从这个角度来看,使用'tail'去除除前N行和所有除最后M行之外的所有行都更好(至少你只需要调整一个整数值)。 – 2013-04-21 00:23:04

回答

3

这可能是你想要什么:

$ tail -n +34 file | head -n -6 

见的,而不是过去的10 tail

-n,--lines = K 输出的最后K线;或使用-n + K到输出开始的行第K个

head

-n,--lines = [ - ]ķ 打印第一K行,而不是第一个10;与领先的' - ',打印每个文件的所有,但最后K行

手册页。

例子:

$ cat file 
one 
two 
three 
four 
five 
six 
seven 
eight 

$ tail -n +4 file | head -n -2 
four 
five 
six 

请注意,您不需要cat(见UUOC)。

2

第一计数总线,然后打印中间部分:(读文件两次)

l=$(wc -l file) 
awk -v l="$l" 'NR>33&&NR<l-6' file 

或在阵列加载文件,然后打印线需要:(读文件一次)

awk '{a[NR]=$0}END{for(i=34;i<NR-6;i++)print a[i]}' file 

或头部的awk,不想那么多了这种方式:(读文件两次)

awk 'NR>33' file|head -n-6 
1
sed -n '1,33b; 34{N;N;N;N;N};N;P;D' file 

这将工作+

1

这可能会为你工作(GNU SED):

sed '1,33d;:a;$d;N;s/\n/&/6;Ta;P;D' file 
相关问题