Bash:删除除最后n行之外的所有输入行

时间:2013-11-14 12:09:26

标签: bash sed awk

我想删除除最后一行或前n行之外的所有行,并使用短单行

例如:

---

aaaa

bbbb

cccc

dddd

cat/echo/find ...  | sed < all except last 2 lines > 

应该结果

aaaa

bbbb

---

aaaa

bbbb

cccc

dddd

eeee

ffff

cat/echo/find ...  | sed < all except last 2 lines > 

应该结果

aaaa

bbbb

cccc

dddd

---

我也需要这个非常高的n。所以可以设置n = 100左右;)

Thanx任何帮助!

8 个答案:

答案 0 :(得分:4)

删除最后两行,您可以使用以下内容:

head -n $(($(wc -l < "$filename") - 2)) "$filename"

不是很优雅,但应该有效。我使用wc -l来计算行数,然后使用head来显示第一行数减去2行。

编辑:保持仅限你可以执行的N

tail -n $N $filename

保持仅限您可以执行的第N行。

head -n $N $filename

似乎我可能误解了你的问题,这就是我添加这两个命令的原因。

答案 1 :(得分:4)

从头文手册页:

-n, --lines=[-]N
      print  the first N lines instead of the first 10; with the lead-
      ing ‘-’, print all but the last N lines of each file

这意味着... | head -n -2会做你想做的事。

作为替代方案,以下内容也有效,但我认为它的效率对大文件来说并不好。

tac file | awk 'NR>2' | tac

答案 2 :(得分:2)

  

我想删除除n last之外的所有行

最简单的方法是做(让n = 5):

tail -n5 $filename > $filename.tmp && mv $filename.tmp $filename

这会将最后五行输出到新文件,然后重命名。

如果任务相反 - 您需要所有行,但最后需要5行,您可以这样做:

head -n$((`cat $filename | wc -l` - 5)) $filename > $filename.tmp && mv $filename.tmp $filename

答案 3 :(得分:1)

保留文件的最后1000行(例如:alert_PROD.log)

fbset -fb /dev/fb0

tvservice -d edid
edidparser edid

要保持前1000行使用head而不是tail命令:

tail -1000 alert_PROD.log > alert_tmp ; cat alert_tmp > alert_PROD.log ; rm alert_tmp

答案 4 :(得分:0)

删除输入文件的最后3行:

set 3 inputfile; sed "$(($(sed -n $= $2)-$1+1)),\$d" $2

答案 5 :(得分:0)

要打印除文件的前3行以外的所有行,然后除了最后3行之外的所有行:

$ cat -n file
     1  a
     2  b
     3  c
     4  d
     5  e
     6  f
     7  g
$ awk -v sz="$(wc -l < file)" 'NR>3' file      
d
e
f
g
$ awk -v sz="$(wc -l < file)" 'NR<=(sz-3)' file
a
b
c
d

答案 6 :(得分:-1)

你可以使用头尾:

删除前n行以外的所有行:

  

head -n filename&gt; new_filename

删除除最后n行之外的所有行:

  

tail -n filename&gt; new_filename

以下是一个例子:

$ cat test

1

2

3

4

5

6

7

8

$ head -2 test

1

2

答案 7 :(得分:-1)

您也可以尝试

awk -vn=2 -f rem.awk input.txt

其中rem.awk

BEGIN { ("wc -l " ARGV[1]) | getline 
    a=$1-n+1 }     
NR<a { print }