7

我想删除除最后 n 行或前 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´s。所以可以设置 n=100 左右;)

感谢您的帮助!

4

8 回答 8

6

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

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

不是很优雅,但它应该可以工作。我使用 wc -l 来计算行数,然后我使用 head 只显示第一个行数减去 2 行。

编辑:只保留N你可以做的最后几行

tail -n $N $filename

要只保留第一N行,您可以这样做。

head -n $N $filename

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

于 2013-11-14T12:15:55.557 回答
5

从头手册页:

-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
于 2013-11-14T12:48:55.070 回答
3

我想删除除 n 最后的所有行

最简单的方法是(让 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
于 2013-11-14T13:36:48.880 回答
3

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

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

要保留前 1000 行,请使用 head 而不是 tail 命令:

head -1000 alert_PROD.log > alert_tmp ; cat alert_tmp > alert_PROD.log ; rm alert_tmp
于 2017-08-24T06:42:33.360 回答
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
于 2013-11-14T17:36:32.237 回答
0

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

set 3 inputfile; sed "$(($(sed -n $= $2)-$1+1)),\$d" $2
于 2013-11-14T13:50:36.263 回答
-1

可以使用head和tail:</p>

删除除前 n 行以外的所有行:</p>

头 -n 文件名 > new_filename

删除除最后 n 行以外的所有行:</p>

tail -n 文件名 > new_filename

这是一个例子:

$猫测试

1

2

3

4

5

6

7

8

$头-2测试

1

2

于 2013-11-14T12:17:34.847 回答
-1

你也可以试试

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

rem.awk在哪里

BEGIN { ("wc -l " ARGV[1]) | getline 
    a=$1-n+1 }     
NR<a { print }
于 2013-11-14T14:39:34.623 回答