2012-08-06 47 views
29

是否有(POSIX命令行)的方式來打印所有的文件,除了最後n行?用例,我將有多個未知大小的文件,所有這些文件都包含已知大小的樣板頁腳,我想刪除它們。我想知道是否已經有一個實用程序在自己寫之前執行此操作。尾部反轉/打印除最後n行之外的所有內容?

回答

33

大多數版本的頭(1) - GNU派生的,特別是但不是BSD派生的 - 具有執行此操作的功能。如果您使用負數來打印行數,它將顯示除文件結尾以外的文件頂部。

像這樣:

head -n -10 textfile 
+8

但在POSIX中,-n必須是正整數。 – choroba 2012-08-06 19:53:37

+1

對於嚴格的POSIX來說足夠了。我應該更清楚我的「最」。如果你打算採用一種更加快速和骯髒的POSIX方法,我會假設'wc -l'加上一些數學會讓你有一個值傳遞給'head' – 2012-08-06 20:06:00

+0

head(1)的大部分實現都缺少這個特性。只有我知道的實現有這個不可移植的代碼。 – 2014-05-07 21:23:27

4

head工具是你的朋友。

head手冊頁:

-n, --lines=[-]K 
    print the first K lines instead of the first 10; 
     with the leading `-', print all but the last K lines of each file 
+3

但是在POSIX中,-n必須是一個正整數。 – choroba 2012-08-06 19:53:21

+4

不幸的是,在BSD派生(即OSX)系統中,負值不是有效的參數-n – Tossrock 2012-08-06 20:07:13

0

如果頁腳與不在別處出現一致的行開始,你可以使用sed

sed '/FIRST_LINE_OF_FOOTER/q' filename 

那打印頁腳的第一行;如果你想避免:

sed -n '/FIRST_LINE_OF_FOOTER/q;p' filename 

這可能是比計數行更加健壯如果在未來頁腳的大小變化。 (或者如果第一行改變,它可能不夠健壯。)

如果系統的head命令不支持head -n -10,另一種方法是預先計算要顯示的行數。下面依賴於特定的bash語法:

lines=$(wc -l < filename) ; ((lines -= 10)) ; head -$lines filename 

注意,head -NUMBER語法是由head爲了向後兼容某些版本的支持; POSIX只允許head -n NUMBER表單。 POSIX也只允許-n的參數爲正整數; head -n 0不一定是空白。

POSIX兼容的

一種解決方案是:

lines=$(wc -l < filename) ; lines=$(($lines - 10)) ; head -n $lines filename 

如果您需要處理古預POSIX炮彈,你可能會考慮這一點:

lines=`wc -l < filename` ; lines=`expr $lines - 10` ; head -n $lines filename 

所有的這些可能,如果做奇怪的事情一個文件長度不超過10行。

+0

除了用於命令替換的古代反引號外,POSIX還具有更爲清晰的'$(...)'語法,它還具有$ ((...))'算術擴展。所以沒必要用反引號和'expr'去古代。 [POSIX命令替換](http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_03) – geirha 2012-08-06 21:36:58

+1

@geirha:好的一點,這個問題特別提到了POSIX。但是如果有任何POSIX之前的shell仍在使用中,那麼瞭解古代語法可能會有用。 – 2012-08-06 22:02:14

3

沒有標準的命令可以做到這一點,但是您可以使用awk或sed填充緩衝區線,並在頭部打印完成後從頭部打印。例如。使用awk:

awk -v n=5 '{if(NR>n) print a[NR%n]; a[NR%n]=$0}' file 
10

可能比「WC」 +「做數學」 +「尾巴」的方法效率較低,而且更容易查看:

tail -r file.txt | tail +NUM | tail -r 

哪裏NUM比一個更您要刪除的結束行數,例如+11將打印除最後10行外的所有內容。這適用於不支持head -n -NUM語法的BSD。

0

這很簡單。您必須將+添加到您想要避免的行數。

這個例子給你除了第9

尾-n +10 inputfile中

所有行(是的,也不是第10 ...因爲它計算不同...如果你想10,只需鍵入 tail -n 11 inputfile)

相關問題