11

現在の行が入力ストリームの最後の行であるかどうかを判断する方法はありますか?

4

11 に答える 11

13

特殊なパターンは、すべての inputENDの終了後にのみ一致します。このパターンは他のパターンと組み合わせることはできません。

おそらく、次の行にリセットして 1 を返す、または EOF の場合は 0 を返すgetline疑似関数の方が便利です! $0私はあなたが望むものだと思います。

例えば:

awk '{ if(getline == 0) { print "Found EOF"} }'

1 つのファイルのみを処理している場合、これは同等になります。

awk 'END { print "Found EOF" }'
于 2009-10-29T21:41:57.960 に答える
9

選択肢が 2 つありますが、どちらも厄介です。

  1. 現在のすべての行のコピーを一時変数に格納し、END ブロックを使用してそれを処理します。
  2. システム コマンドを使用して BEGIN ブロックで "wc -l | getline" を実行し、ファイル内の行数を取得してから、その値をカウントアップします。

実行するには #2 を少しいじる必要があるかもしれませんが、うまくいくはずです。awkをやったのは久しぶりです。

于 2009-10-29T21:40:42.250 に答える
7

これらは、あなたが望むことを行うための唯一の賢明な方法です。

awk 'NR==FNR{max++; next} FNR == max { print "Final line:",$0 }' file file

awk -v max="$(wc -l < file)" 'FNR == max { print "Final line:",$0 }' file

awk 'BEGIN{ while ( (getline dummy < ARGV[1]) > 0) max++; close(ARGV[1])} FNR == max { print "Final line:",$0 }' file
于 2012-12-12T20:55:25.007 に答える
4

gawkENDFILEの実装には、引数リスト内のすべてのファイルを処理した後にトリガーされる特別なルールが呼び出されます。これは機能します:

awk '{line=$0} ENDFILE {print line}' files...

詳細はこちら>>

于 2016-10-13T12:18:07.430 に答える
2

この「解決策」をどのように分類するかさえわかりません

{
    t = lastline
    lastline = $0
    $0 = t
}

/test/ {
    print "line <" $0 "> had a _test_"
}

END {
    # now you have "lastline", it can't be processed with the above statements
    # ...but you can work with it here
}

このハックのすばらしい点は、に割り当てること$0で、残りのすべての宣言型パターンとアクションが機能し、1行遅れることです。上にEND置いても、それらを機能させることはできませんが最後の行を制御でき、他に何もしていません。END

于 2009-11-05T01:28:07.127 に答える
2

引数リスト内の各ファイルの最後の行を検出するには、次のようにするとうまくいきます。

FNR == 1 || EOF {
  print "last line (" FILENAME "): " $0
}
于 2010-09-09T17:49:39.717 に答える
1

sed簡単な方法の 1 つは、最終行以外のすべての行に 0 を配置し、最後の行に 1 を配置する中間スクリプトを介してファイルを実行することです。

cat input_file | sed 's/^/0/;$s/0/1/' | awk '{LST=/^1/;$0=substr($0,2)}
... your awk script in which you can use LST to check for the
... last line.'
于 2011-12-06T03:17:29.740 に答える
0

あなたはこれを試すことができます:

awk 'BEGIN{PFNR=1} FNR==PFNR{PFNR++;next} {print FILENAME,PFNR=2} END{print FILENAME}' file1 file2
于 2016-02-18T08:47:49.530 に答える
0

うーん、 awkEND変数は、いつ到達したかを示しますEOF。あまり参考にならないと思います

于 2009-10-29T21:27:05.533 に答える
0

別の回答で述べたように、gawk 自体には BEGINFILE と ENDFILE がありますが、ポータブル ソリューションは gawk ユーザー マニュアルで提供されています。

于 2018-01-02T16:55:06.973 に答える