2011-11-18 7 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

私はLINESで何が起こっているのかを伝えることはできませんが、私は別の解決策を提供することができます:ヘッド(1)/テールは(1)/最初の最後の行をNをスキップできるようにし、あなたは自分で数学をする必要はありません。 –

答えて

5

$LINESは特別な意味を持ちます。これは端末の行数で、端末ウィンドウのサイズを変更すると再設定されます。 info "(bash)Bash Variables"を参照してください。

+1

これは、環境変数との衝突を避けるために、すべて大文字の変数名を使用しないでください。 – Sorpigal

0

問題がどこにあるのかは、常に分解するのに役立ちます。実行中

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

おそらく問題の場所を示す必要があります。

代わりに、

LINES=$(wc -l < $FILENAME) 

フムを使用し...はい、私は@MichaelHoffmanはおそらく、より正確に、あなたの問題を診断したさ怖いです。

こちらがお役に立てば幸いです。 X、Yは、あなたが(この場合には、それは1,2だろう)を省略したい行の範囲である場合には

0

また、単にsed 'X,Yd' < file

を行うことができます。

他の選択肢は以下のとおりです。

sed 'X,+Yd'がラインから始まるYラインを省略X

sed /regex/,Yd'正規表現の一致とY

sed '/regex/,+Yd'正規表現マッチところから始まるYラインを省略線との間のすべてを省略

sed '/regex/,/regex/d'は、2つの正規表現間のすべてを省略します

注:これらはGNU sedをされている拡張

関連する問題