使用 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"
如果之前有人问过这个问题,我深表歉意。我看过但找不到满意的答案。
我有这个示例文件,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"