我有一个数据文件:
> 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 的行。
如果我误解了你的任务,请纠正我