2012-08-06 7 views
29

最後のn行を除いてすべてのファイルを印刷する方法(POSIXコマンドライン)はありますか?ユースケースでは、サイズを不明な複数のファイルがあります。これらのファイルには、削除したい既知のサイズの定型フッターが含まれています。私はそれを自分で書く前にすでにこれを行うユーティリティがあるのだろうかと思っていました。最後のn行を除いてすべてを逆/印刷しますか?

答えて

33

head(1) - GNU由来、特にBSD由来ではありません - これを行う機能があります。印刷する行数に負の数を使用すると、ファイルの先頭には終わりが表示されます。そのよう

head -n -10 textfile 
+8

しかし、POSIXでは、-nは正の整数でなければなりません。 – choroba

+1

厳密なPOSIXに対して十分真です。私は私の "最も"と明確になっていたはずです。より速く汚れたPOSIXメソッドを使うつもりなら、私は 'wc -l'といくつかの計算に' head'に渡す値を与えると仮定します。 –

+0

head(1)のほとんどの実装にはこの機能がありません。私が知っている実装では、この移植不可能なコードがあります。 –

4

headユーティリティはあなたの友達です。フッターは他の場所で表示されない一貫した行で始まる場合、あなたはsedを使用することができます

-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

+4

残念なことにBSDの派生(つまりOSX)システムで負の値は-nの有効な引数ではありません – Tossrock

0

headのmanページから

sed '/FIRST_LINE_OF_FOOTER/q' filename 

フッターの最初の行を印刷します。あなたはそれを避けたい場合:

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

これは、将来的にはフッターの変化の大きさならばラインを数えるよりも堅牢である可能性があります。

システムのheadコマンドがhead -n -10をサポートしていない場合は、表示する行数を事前に計算することもできます。以下は、bashの固有の構文に依存します:head -NUMBER構文は下位互換性のためにheadの一部のバージョンでサポートされていることを

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

注意。 POSIXはhead -n NUMBERフォームのみを許可します。 POSIXではまた、-nへの引数が正の10進整数であることだけを許可します。 head -n 0は必ずしもノーオペレーションである必要はありません。

A 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

+1

@geirha:良い点ですが、特にPOSIXについて質問しました。しかし、古いPOSIXシェルがまだ使用されている場合には、古い構文を知っておくと便利です。 –

3

標準的なコマンドはありませんが、N行のバッファにawkまたはsedを使用していっぱいになると印刷できます。例えば。awkを持つ:

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

を見て、おそらく以下「WC」+「やる数学」+「尾」の方法よりも効率的で、もっと簡単:NUMがより1にある

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

あなたが削除したい終了行の数、例えば+11は最後の10行を除くすべての行を出力します。これは、head -n -NUM構文をサポートしていないBSDで動作します。

0

簡単です。あなたは避けたい行の数に+を追加する必要があります。

この例では(はい、いない最初の10 ...あなたがしたい場合、それは...違うカウントされるため、あなたに

inputfileに10 -n最初の9

尾を除くすべての行を提供します10、ちょうど tail -n 11入力ファイルを入力してください)

関連する問題