![尝试使用 awk 根据第一列的值过滤 dat 或 csv 文件时出现问题?](https://linux22.com/image/117617/%E5%B0%9D%E8%AF%95%E4%BD%BF%E7%94%A8%20awk%20%E6%A0%B9%E6%8D%AE%E7%AC%AC%E4%B8%80%E5%88%97%E7%9A%84%E5%80%BC%E8%BF%87%E6%BB%A4%20dat%20%E6%88%96%20csv%20%E6%96%87%E4%BB%B6%E6%97%B6%E5%87%BA%E7%8E%B0%E9%97%AE%E9%A2%98%EF%BC%9F.png)
我有一个数据文件:
> 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 的行。
如果我误解了你的任务,请纠正我