0

以前、awk を使用してカウント データのエラーを修正する方法を尋ねました。データの最初の列は、測定されているサブアリーナを識別するために使用される数値であり、2 番目の列はそのサブアリーナからのカウント データです。カウントは自動化されており、プログラムはエラーを起こします (下に # で示されています)。カウントされている動物が特定のサブアリーナの範囲外に移動したため、「ミスカウント」することがあります。

1       0
1       2
1       6
1       7
1       7
1       8
1       7 #
1       7 #
1       9
2       0
2       0
2       1
2       4
2       3 #
2       3 #
2       4
2       4
2       6

上記を次のように修正したいと思います。

1       0
1       2
1       6
1       7
1       7
1       8
1       8
1       8
1       9
2       0
2       0
2       1
2       4
2       4
2       4
2       4
2       4
2       6

親切に提案されたコードには、各アリーナのデータ内で修正するための for ループが含まれていませんでした (ファイルごとに合計 20 あります)。これを理解しようとしましたが、構文エラーで非常に苦労しています。場合によっては不正なステートメント エラーが発生することもあります。以下が機能しない理由についてのヒントをいただければ幸いです(申し訳ありませんが、私は初心者です。これは私が試した多くの反復の1つであり、どれもきれいではありません)。

awk 'i=1; i<=20; i++; $1=i {NR > 1 && $2 < p {$2 = p} {p = $2} 1}' infile > outfile
4

1 に答える 1

2

p行数をカウントするのではなく、行番号がインクリメントされるとリセットされる行番号を追跡する別の変数を持たないでください:

awk '$1 > l { l = $1; p = 0 } $2 < p { $2 = p } { p = $2 } 1' input-file

まず、最初の位置 ( ) が変数の値 (デフォルトは 0)$1と比較されます。l大きい場合lは に設定され$1pは 0 にリセットされます。次に、2 番目の位置 ( $2) が と比較されp、小さい場合は に設定されpます。最後にp、(変更される可能性があります) の値に設定されます$2。最後1は単に「印刷」を意味します。そうしないと、コマンドはすべての処理を行いますが、何も出力しません。

于 2012-07-31T03:30:42.773 に答える