列の1つが特定の値と一致するawkから行を印刷する方法は?

列の1つが特定の値と一致するawkから行を印刷する方法は?

したがって、数百万行のカンマ区切り値を含む大きなファイルがあります。

132.3,-23.3,1659614391.4174244,539.0,0,l_top
132.3,-23.1,1659614391.4174244,548.0,0,l_top
131.9,-22.900000000000002,1659614391.4174244,539.0,0,l_top
132.1,-22.700000000000003,1659614391.4174244,541.0,0,l_top
132.20000000000002,-22.5,1659614391.4174244,548.0,0,l_top
131.8,-22.200000000000003,1659614391.4174244,543.0,0,l_top
133.5,-22.3,1659614391.4174244,551.0,0,l_top
133.0,-22.1,1659614391.4174244,547.0,0,l_top
133.5,-21.900000000000002,1659614391.4174244,545.0,0,l_top
133.5,-21.700000000000003,1659614391.4174244,558.0,0,l_top

l_topawkを使用して、以下のように最後の列値を持つ行を抽出しようとしています。

awk -F ',' '{ if ($6 == "l_top") { print } else { exit }}' <file>

何も印刷されません。たとえば、他の列をフィルタリングすると$5 == 0正常に動作します。たぶん行末に問題があるのでしょうか?列の値に基づいてフィルタリングする正しい方法は何ですか?

答え1

これは「プログラム終了」を意味するため、プログラムはexit最初の行から始まらないでしょうl_topnext

awk -F ',' '{ if ($6 == "l_top") { print } else { next }}' <file>

ただし、何かがtrueの場合、awkのデフォルトのジョブはその行を印刷するため、明示的に指定する必要さえありませんprint

awk -F, '$6 == "l_top"' file

それ以外の場合:

grep ',l_top$' file

答え2

テドンの答え問題に対する解決策であり、フィルタ基準を満たさない最初のレコードでコードが終了する理由も説明します(つまり、exit実行を終了します)。ただし、CSVファイルにより複雑なフィールド(カンマ、改行など)が含まれている場合は、CSV認識ツールを使用して目的のレコードを抽出する必要があります。

ここで使われるものはミラーmlr)はヘッドレスCSVファイルを解析し、file.csv最後のフィールドが文字列であるレコードを抽出しますl_top

mlr --csv -N filter '$[NF] == "l_top"' file.csv

または、数字で6番目の列にアクセスするには

mlr --csv -N filter '$6 == "l_top"' file.csv

またはヘッダーがあり、最後のフィールドのヘッダーが次の場合label(ここでは削除されません-N):

mlr --csv filter '$label == "l_top"' file.csv

答え3

DOS行の終わりがあるので、$6代わりに次を参照してくださいl_topl_top\rhttps://stackoverflow.com/questions/45772525/why-does-my-tool-output-overwrite-itself-and-how-do-i-fix-it

コマンドを次に変更します。

awk -F ',' '{ sub(/\r$/,""); if ($6 == "l_top") { print } else { exit }}' <file>

関連情報