したがって、数百万行のカンマ区切り値を含む大きなファイルがあります。
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_top
awkを使用して、以下のように最後の列値を持つ行を抽出しようとしています。
awk -F ',' '{ if ($6 == "l_top") { print } else { exit }}' <file>
何も印刷されません。たとえば、他の列をフィルタリングすると$5 == 0
正常に動作します。たぶん行末に問題があるのでしょうか?列の値に基づいてフィルタリングする正しい方法は何ですか?
答え1
これは「プログラム終了」を意味するため、プログラムはexit
最初の行から始まらないでしょうl_top
。next
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_top
。l_top\r
https://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>