web-dev-qa-db-ja.com

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

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

2番目に投票された回答この質問 では、次のようにしてファイルの最後の行を削除することをお勧めします。

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

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

head: illegal line count -- -1

何故ですか? Mlastを削除するにはどうすればよいですかfirstN指定されたファイルの行?

14

最初の12行を削除するには、次のようにします。

tail -n +13

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

GNU headサポートのようなheadのいくつかの実装:

head -n -12

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

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

tail -r(GNU tacも参照)があるシステムで機能しますが、最適ではありません。

nは1です。

sed '$d' file

あなたも行うことができます:

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

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

できるよ:

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

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

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}'
20

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

N=5M=7およびファイルtest.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
2
jofel

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

head -$(($(wc -l < foo.txt) - 100)) foo.txt > temp.txt
1
make