-2

こんにちは友達みんなこんにちは私はawkの初心者なので、テキストファイルにレコード(行)の総数を印刷したいので助けてください。そのために「printNR」コマンドを使用します。これを使用するときBEGINブロックでコマンドを実行すると、合計を出力する代わりにレコード数が出力されますが、ENDブロックで使用すると、レコードの合計数が返されます。たとえば、5列のテキストファイルがあり、次のように試しました。BEGIN{printNR}それは12345を返します

BEGINブロック自体からのレコード(行)の総数を出力したいので、答えを教えてください。

4

3 に答える 3

2

NRは、ファイルが読み取られるときに入力/インクリメントされます。BEGINは、ファイルが開かれる前に実行されるため、具体的に要求していることは実行できません。

回避策は次のとおりです。

awk 'BEGIN{ while ( (getline var < ARGV[1] > 0) ) nr++; print nr }' file

ただし、UNIXでは、レコードが改行で区切られている場合、より簡単な方法があります。例:

awk -v nr="$(wc -l < file)" 'BEGIN{ print nr }' file

また、awkでは、おそらく次を使用して必要な出力を取得できます。

awk 'NR!=FNR && FNR==1 { print NR - FNR }' file file
于 2012-11-05T12:25:52.903 に答える
1

BEGINブロックは、ファイル処理を1行ずつ開始する前に実行されます。BEGINそのため、ブロック内の合計レコードを取得することはできません。

以下のような奇妙な方法で行う必要があります。

awk 'BEGIN{"wc -l "FILENAME|getline result;print result}' your_file

ここで、上記は文字通りawkが何もしていないことを意味します。実際にはほとんどのことを行っているシェルです。

于 2012-11-05T12:19:16.873 に答える
1

ブロックはファイルが処理される前に実行されるBEGINため、ブロック内のレコード/行の数にアクセスするには、変数を渡す必要があります。BEGIN

awk -v count="$(wc -l < file.txt)" 'BEGIN { print count }' file.txt
于 2012-11-05T12:20:34.703 に答える