尝试使用 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

答案2

命令:

awk '/"201731"/' file

将仅输出包含 201731 的行。

如果我误解了你的任务,请纠正我

相关内容