使用 GNU AWK 处理引用字段中的数据

Working with data in quoted fields with GNU AWK

如果之前有人问过这个问题,我深表歉意。我看过但找不到满意的答案。

我有这个示例文件,test.csv:

"abc","def,apple","2019-10-10"

我想根据最后一个字段中的日期输出任何第一个字段。我试过这个

gawk -vFPAT='[^,]*|"[^"]*"' '( >= "2018-10-10") {print }' test.csv

但输出为空。

如果我删除 test.csv 中日期周围的引号,则上述方法有效。该命令输出“abc”。我有一个遵循上述模式的长文件,我确定我可以使用一个简单的正则表达式来删除日期周围的引号,但是有没有办法通过更改上面的 gawk 命令来避免这种情况?

使用 awk:

awk -F ',' '$NF >= "\"2018-10-10\""{ print  }' test.csv

awk -F '"' '$(NF-1) >= "2018-10-10"{ print  }' test.csv

$NF 包含最后一列

</code> 是 <code>"2019-10-10",即包含引号,因此您需要在要比较的字符串中包含引号:

gawk -v FPAT='[^,]*|"[^"]*"' '( >= "\"2018-10-10\"") {print }' test.csv
"abc"

这与仅通过设置 FS 起作用的解决方案之间的区别是它将继续起作用if/when您需要对最后一个字段以外的字段进行操作,即使您的某些字段包含逗号 ( ,) 或转义引号 ("")。如果您的输入是:

,请尝试所有解决方案
$ cat test.csv
"abc","very,""bad"",field","2019-10-10","other,""bad"",field."

$ gawk -v FPAT='[^,]*|"[^"]*"' '( >= "\"2018-10-10\"") {print }' test.csv
"abc"

你可能真的想将目标日期作为变量传递,所以我会这样写:

$ gawk -v FPAT='[^,]*|"[^"]*"' -v tgt='"2018-10-10"' ' >= tgt {print }' test.csv
"abc"