[英]Bash: remove all lines of input except last n lines
我想刪除除了最后一行或前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任何幫助!
要刪除最后兩行,您可以使用以下內容:
head -n $(($(wc -l < "$filename") - 2)) "$filename"
不是很優雅,但它應該工作。 我使用wc -l來計算行數,然后我使用head來顯示第一行數減去2行。
編輯:只保留你可以做的最后N
行
tail -n $N $filename
只保留前N
行,你可以做。
head -n $N $filename
我似乎誤解了你的問題,這就是我添加這兩個命令的原因。
從頭文章頁面:
-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
... | head -n -2
會做你想要的。
作為替代方案,以下內容也可以使用,但我認為它的效率對於大文件來說並不是很好。
tac file | awk 'NR>2' | tac
我想刪除除最后一行之外的所有行
最簡單的方法是做(讓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
保留文件的最后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
要刪除inputfile的最后3行:
set 3 inputfile; sed "$(($(sed -n $= $2)-$1+1)),\$d" $2
要打印除文件的前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
你可以使用頭部和尾部:
要刪除除前n行之外的所有行:
head -n filename> new_filename
刪除除最后n行之外的所有行:
tail -n filename> new_filename
這是一個例子:
$ cat測試
1
2
3
4
五
6
7
8
$ head -2測試
1
2
你也可以試試
awk -vn=2 -f rem.awk input.txt
rem.awk
在哪里
BEGIN { ("wc -l " ARGV[1]) | getline
a=$1-n+1 }
NR<a { print }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.