3

テストファイルがあります:

1
2
3
4
5
6
7
8

このコマンドは、ファイルの最後の 4 行を出力します。

$ awk 'BEGIN{"wc -l < file" | getline b}{if(NR>b-4) print}' file
5 
6 
7 
8 
userpc@userpc-desktop

今、私は同じことをしたいのですが、コマンドシステム ():

$ awk '{if( NR > (system("wc -l < file")-4) ) print}' file
8 
1 
8 
2 
8 
3 
8 
4 
8 
5 
8 
6 
8 
7 
8 
8 
userpc@userpc-desktop:

最後のコマンド システム () を改善するには? また、ファイルの最後の 4 行を印刷したいと考えています。ご協力ありがとうございました。

4

7 に答える 7

14

awk は必要ありません。次を使用しますtail

$ tail -4 your_file
于 2012-09-22T19:16:43.910 に答える
9

awkこれには間違いなく適切なツールではありません。行うのが一般的です:sed '1{N;N;N;}; N; D; $p'、そしてあなたはawkで同様のことをすることができます:

awk '{for( i=0;i<3;i++) a[i]=a[i+1];a[3]=$0} END {print a[0],a[1],a[2],a[3]}' OFS='\n'

基本的に、最後に表示された4行を追跡し、ファイルの最後に到達したときにすべてを印刷します。次の方法で、もう少しわかりにくく効率的になることができます。

awk '{a[++i%4]=$0} END {print a[++i%4],a[++i%4],a[++i%4],a[++i%4]}' OFS='\n'

しかし、本当に、なぜあなたは?

于 2012-09-22T20:05:24.057 に答える
6

使用する1つの方法GNU awk

awk '{ array[NR]=$0 } END { for (i=NR-3; i<=NR; i++) print array[i] }' file.txt

結果:

5
6
7
8
于 2012-09-23T04:36:18.837 に答える
5

wcinsideの使用を改善するメカニズムが必要な場合はsystem、次を試してください。

awk 'NR > count-4' count=$( wc -l < file ) file

これをawk内でさらに行うには;

awk 'NR==1{ c="wc -l < " FILENAME; c | getline count } NR > count-4' input

FILENAME が BEGIN ブロック内で定義されていないため、これは BEGIN の代わりに NR==1 を使用します。systemから出力を取得する良い方法がないため、これらのどちらも awk 内から使用しないことに注意してください。ただし、次のsystemような醜いことを行うことができます。

awk 'NR==1 { system( "wc -l > tmpfile < " FILENAME ); getline count < "tmpfile" }
    NR > count - 4' input

これが単なる学問的な演習であることは強調しきれません。これには awk を使用しないでください。

于 2012-09-22T21:02:19.667 に答える
2

tacとを使用する別の方法を次に示しますawk

$ tac file | awk 'NR==5{exit}1' | tac
5
6
7
8
  • tacファイルを反転します。
  • awk最初の 4 行を出力して終了します (ファイルが非常に大きい場合に便利です)。
  • tacファイルを再び反転するには
于 2014-05-23T06:30:41.003 に答える
2

tailは適切なツールですが、Awk で実行したい場合は次のようにします。

awk '{b=b RS $0} b~/(\n.*){4}/{sub(/[^\n]*\n/,"",b)} END{print b}'
  1. 改行で区切られた行をバッファに追加します。
  2. バッファに 4 つの改行がある場合、最初の行を削除します。
  3. 最後に、バッファを印刷します。
于 2013-06-24T23:30:23.237 に答える
1
awk 'NR==5, NR==8{print NR} file

5行目から8行目くらいまで印刷

于 2014-01-05T21:10:02.290 に答える