以下内容将输出"b1
,因为它会将带引号的空格识别为字段定界符。如何告诉awk忽略带引号的定界符,以便输出b1 b2
或"b1 b2"
echo 'a "b1 b2" c'| awk '{print $2}'
我看到了以下两个相关的帖子,但是在使解决方案起作用时遇到了麻烦。我希望找到一个简单的解决方案。字段解析是awk的专长,对吗?
awk ignore delimiter inside single quote within a parenthesis What's the most robust way to efficiently parse CSV using awk?
答案 0 :(得分:3)
通过gawk
(GNU awk),您可以使用FPAT
特殊变量来定义字段的外观,而不必局限于指定分隔符:
echo 'a "b1 b2" c'| gawk '{print $2}' FPAT='("[^"]+")|[^[:blank:]]+'
在这里我们说:字段是"
,后跟非"
字符和结尾的"
-> ("[^"]+")
...或|
一系列非空字符-> [^[:blank:]]+
这些正则表达式将按顺序进行评估,因此""
中包含的字段优先于第二种模式,即非空字符的序列(awk的默认值)。
请参阅GNU awk手册:Defining fields by content
答案 1 :(得分:0)
最短的答案:
echo 'a "b1 b2" c'| awk -F\" '{print $2}'
将输出:b1 b2
答案 2 :(得分:0)
您可以通过这种方式获得想要的东西:
awk '{split($0,a,/^"|" "| "|" |"$/);j=a[1]!=""?0:1;print a[2+j]}'
我认为您可以找到一种失败的方法...
答案 3 :(得分:0)
awk对我想要的引用字段没有简单,方便的支持。我也看了看伤口,但也没看。
另一个称为csvcut的bash shell工具是作为csvkit工具捆绑提供的一部分,它确实为引用字段提供了轻松支持。我的数据是用空格定界的,而不是用逗号定界的,但是我可以轻松地为csvcut工具指定一个空格定界符。
这就是我想要的:
# Gives a
echo 'a "b1 b2" c d e' | csvcut -d ' ' -c 1
# Gives b1 b2
echo 'a "b1 b2" c d e' | csvcut -d ' ' -c 2
# Gives c
echo 'a "b1 b2" c d e' | csvcut -d ' ' -c 3