31

私は awk/gawk を学んでいます。だから最近は、練習の機会を増やすために、問題を解決しようとしています。

私の同僚は昨日質問をしました、

「ファイルから最初と最後の行を削除する方法」

. 私はそれがうまくいくことを知っていsed '1d;$d' fileます。head/tailパフォーマンスが悪くても機能します。私は彼にsed 1を話しました、彼は幸せでした。

後で、私は awk ワンライナーを書こうとしていました: これまでのところ、私が得たものは:

awk 'NR>1{a[++k]=$0}END{for(i=1;i<k;i++)print a[i]}'

これにより、最後の行をスキップするためだけに、ファイル全体が配列に格納されます。それを行うためのより簡単な(またはより良い)方法があるはずだと感じています..

(より簡単で、より速く、より良い方法がない場合は、質問を削除します)

4

3 に答える 3

72

これはトリックを行います:

awk 'NR>2 {print last} {last=$0}'

awkprint lastNR > 2 (つまり、最初の 2 行以外のすべての行) の場合にのみアクションを実行します。すべての行で、変数lastを現在の行に設定します。そのawkため、3 行目を読み取ると、2 行目を出力します (これは に格納されていlastます)。最後の行 (行 n) を読み取ると、行 n-1 の内容を出力します。正味の効果は、行 2 から n-1 が印刷されることです。

于 2013-04-06T22:33:14.000 に答える
19

別の解決策を提案させてください。上下の行にカスタム N が必要な場合は、tailコマンドとheadコマンドを使用できます。

awk '{print $1}'  | head -n -1 | tail -n+2

head -n -1 - 最後の行を削除します

tail -n+2 - 2 行目から出力を開始します (1 行削除します)

次のコマンドは、上下から 3 行を削除します。

awk '{print $1}'  | head -n -3 | tail -n +4

実際、ここでは awk も必要ありません。

more | head -n -1 | tail -n +2

また

cat | head -n -1 | tail -n +2

Igor Fobiaのコメントに感謝します!

于 2015-10-16T01:29:45.600 に答える