2011-11-18 36 views
1

我正在嘗試從文件中修剪幾行。我知道要刪除多少行(例如,從頂部2),但不知道文件中有多少行。所以,我想這個簡單的解決方案:

$ wc -l $FILENAME 
119559 my_filename.txt 
$ LINES=$(wc -l $FILENAME | awk '{print $1}') 
$ tail -n $(($LINES - 2)) $FILENAME > $OUTPUT_FILE 

輸出是好的,但發生了什麼事?LINES

$ wc -l $OUTPUT_FILE 
119557 my_output_file.txt 
$ echo $LINES 
107 

希望有人能幫助我理解發生了什麼事。

+1

我不能告訴你什麼是用線發生,但我可以提供一個替代的解決方案:頭(1)/尾(1)允許第一跳過N /最後幾行,所以你不必自己做任何數學。 –

回答

5

$LINES有特殊含義。這是終端的行數,如果您調整終端窗口大小,它將被重新設置。請參閱info "(bash)Bash Variables"

+1

這是你永遠不應該使用全大寫變量名稱的另一個原因:避免與環境變量衝突。 – Sorpigal

0

它總是有助於分解問題所在。運行

wc -l $FILENAME | awk '{print $1}' 

應該可能告訴你問題出在哪裏。

相反,使用

LINES=$(wc -l < $FILENAME) 

嗯...是的,我怕@MichaelHoffman很可能有更多的準確診斷您的問題。

我希望這會有所幫助。

0

你也可以只做到sed 'X,Yd' < file

其中x,y是要忽略(在這種情況下,將1,2)線的範圍。

其他的選擇是:

sed 'X,+Yd'省略了從線X

sed /regex/,Yd'省略其中的正則表達式匹配和Y

sed '/regex/,+Yd'忽略Y線從那裏正則表達式匹配啓動線之間的一切開始Y線

sed '/regex/,/regex/d'忽略兩個正則表達式之間的所有內容

注:這些GNU sed的擴展