ヘッド/テールへの負の引数


13

この質問の変種は確かにさまざまな場所で何度か尋ねられていますが、私はM運のないファイルから最後の行を削除しようとしています。

二番目に投票の回答、この質問は、ファイルの最後の行を取り除くために、次のことをお勧めします:

head -n -1 foo.txt > temp.txt

ただし、OSXとZshでそれを試すと、次のようになります。

head: illegal line count -- -1

何故ですか?どのように私は削除することができM 、最後の最初の N与えられたファイルの行を?



1
の出力はhead --version何ですか?どのシステムを使用していますか?
ジョフェル14年

@jofel head --versionは実際にエラーを返します。
アメリオバスケスレイナ14年

回答:


19

次のようにして最初の12行を削除できます。

tail -n +13

(つまり、13行目から印刷します。)

head同様のGNU headサポートの実装:

head -n -12

しかし、それは標準ではありません。

tail -r file | tail -n +12 | tail -r

tail -r(GNUも参照tac)が最適ではないシステムで動作します。

n1はどこですか

sed '$d' file

次のこともできます。

sed '$d' file | sed '$d'

2行を削除しますが、それは最適ではありません。

できるよ:

sed -ne :1  -e 'N;1,12b1' -e 'P;D'

ただし、一部の実装ではnの大きな値では機能しないことに注意してくださいsed

awk

awk -v n=12 'NR>n{print line[NR%n]};{line[NR%n]=$0}'

m先頭とn末尾から行を削除するには:

awk -v m=6 -v n=12 'NR<=m{next};NR>n+m{print line[NR%n]};{line[NR%n]=$0}'

sed 'x;1d;$d'最後の2行を取得するためにも使用できます。そして、w /を2、3 Nの後1dに使用すると、それ以上の効果が得られる可能性がありますが、その時点ではN;P;D既に推奨しているループよりも利点はありません。
mikeserv 14年

ありがとう-最後のコマンドは非常に役立ちます。夏小さな警告:それは動作しませんmnです0。そうでなければ完璧です。
アメリオバスケスレイナ14年

2

次の方法を使用して、最初のN行と最後のM行を削除できます。

およびファイル:N=5M=7test.txt

sed -n -e "6,$(($(wc -l < test.txt) - 7))p" test.txt

このコマンドは、N + 1からLastLine-Mまでのすべての行を印刷します。

別のオプションはpythonを使用することです:

python -c 'import sys;print "".join(sys.stdin.readlines()[5:-7]),' < test.txt

1

次のようにMして、ファイルから最後の(ここではM = 100)行を削除できます。

head -$(($(wc -l < foo.txt) - 100)) foo.txt > temp.txt
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.