如何告诉awk忽略双引号中的delmiter
例如
line='test,t2,t3,"t5,"'
$(echo $line | awk -F "," '{print $4}')
预期值为“t5” 但事实上是“t5”
如何获得“t5”?
答案 0 :(得分:1)
使用GNU awk for FPAT,您需要的只是:
$ line='test,t2,t3,"t5,"'
$ echo "$line" | awk -v FPAT='([^,]*)|("[^"]*")' '{print $4}'
"t5,"
如果您的awk可以包含换行符和转义引号,请参阅What's the most robust way to efficiently parse CSV using awk?。
答案 1 :(得分:-1)
您可以检查您的任意输入,或者如果您知道输入格式不正确,请从第4列的索引2开始使用substr()
。
$ echo 'test,t2,t3,"t5,"' | awk -F, '{printf "%s,\n", substr($4,2) }'
t5,
答案 2 :(得分:-1)
也许这更好。
echo 'test,t2,t3,"t5,"' | awk -F, '{print $(NF-1),$NF}' OFS=,
"t5,"
答案 3 :(得分:-1)
在一般情况下,你不能。您需要一个完整的解析器来记住标记,更改状态,然后在遇到匹配标记时返回到先前的状态。你不能用正则表达式来做,除非你对数据的形状做了很多假设 - 而且因为我看到你正在解析CSV,所以这些假设不会成立。
如果你喜欢awk,我建议你为这个问题尝试perl。您可以使用其他人的CSV解析库(搜索here),也可以编写自己的。当然,没有理由你不能在纯awk中编写CSV解析器,只要你明白这不是awk擅长的。你需要逐个字符地解析(不要用换行符分隔记录),记住当前状态(是引用的行吗?)并记住前一个字符以查看它是否是反斜杠(用于将引用视为文字引用或逗号作为文字逗号)。您需要记住之前的引用,以便将""
解析为转义引号而不是格式错误的字段。这很有趣,而且是个婊子。如果你愿意,可以使用别人的图书馆。我不会选择awk来编写任何记录没有明显分隔符的解析器。
编辑:Ed Morton确实为Gawk编写了一个完整的CSV解析器,他在答案中将其链接到了。我帮他打破了,他迅速解决了问题。他的剧本很有用,虽然适应现实世界的使用会有点笨拙。