awk忽略带引号的定界符'echo'a“ b1 b2” c'| awk'{print $ 2}'`

时间:2019-05-31 17:26:50

标签: awk

以下内容将输出"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?

4 个答案:

答案 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