awkを使用して最初の列の値に基づいてdatまたはcsvファイルをフィルタリングするのに問題がありますか?

awkを使用して最初の列の値に基づいてdatまたはcsvファイルをフィルタリングするのに問題がありますか?

データファイルがあります。

> head file.dat 
"201731","474","1000522966","0.2670"
"201732","474","1000522966","0.3163"
"201733","474","1000522966","0.3902"
"201734","474","1000522966","0.4479"
"201735","474","1000522966","0.5960"
"201736","474","1000522966","0.2598"
"201737","474","1000522966","0.3937"
"201738","474","1000522966","0.3558"
"201739","474","1000522966","0.3344"
"201740","474","1000522966","0.5544"

「201731」の行のみを保持するようにフィルタリングしたいと思います。

私はいくつかのawkコマンドを試しました。

awk -F , '{ if ($1 == "201731") { print } }' file.dat | head
awk -F '","' 'BEGIN {OFS=","} { if (toupper($1) == "201731")  print }' file.dat | head 
awk -F '","' '{ if (toupper($1) == "201731")  print }' file.dat | head 
awk -F ',' '{ if (toupper($1) == "201731")  print }' file.dat | head 

それらのどれも動作しません。どちらもエラーなしで実行され、出力がない空のプロンプトが表示されます。

私はawkバージョンGNU Awk 3.1.7を使用しています。

このウェブサイトにはほとんど同じ質問と回答がありますが、それも機能しません。私は何が間違っていましたか?

ベストアンサー1

あなたのコード:

awk -F , '{ if ($1 == "201731") { print } }' file.dat

$1フィールド区切り文字を使用して読み取るときに,データに二重引用符も含まれることを除いて、これはほぼ正確です。他の試みも本質的に似ていますが、toupper()数字にどのような影響があると思うのかわかりません。

$1 ~ /201731/正規表現を使用して最初のフィールドの一致を使用する場合(または$1 ~ /^"201731"$/間違った肯定を防ぐために最初から最後までフィールドの内容を完全に指定)、正規表現の数式の一致を実行する代わりに固定文字列を確認したい場合は使用できますが、テストフィールドの場合\"201731\"

だからあなたは

awk -F ',' '$1 ~ /^"201731"$/' file.in

または

awk -F ',' '$1 == "\"201731\""' file.in

おすすめ記事