如何更改脚本部分的awk分隔符?

时间:2016-12-21 19:48:13

标签: bash parsing awk

我有一个输入字符串,其格式如下:

string1;string2"string3";string4

我想解析此文件以使用string3获取awk的值。为此,我可以先按;分隔,打印第二个分段,然后按"分隔并打印第二个分段。使用管道的示例:

$ echo 'string1;string2"string3";string4' | awk -F\; '{print $2}' | awk -F\" '{print $2}';
string3

我想将它组合成一个awk命令,但我不知道如何在命令期间更改字段分隔符。我可以在awk中使用语法来更改我的分隔符吗?

2 个答案:

答案 0 :(得分:4)

您可以在awk内使用split function

s='string1;string2"string3";string4'
awk -F ';' 'split($2, a, /"/){print a[2]}' <<< "$s"

string3

根据链接的文档:

  

split(string, array [, fieldsep [, seps ] ])
  将字符串分成由fieldsep分隔的片段,并将片段存储在数组中,将分隔符字符串存储在seps数组中。

答案 1 :(得分:2)

请你试着跟我来,让我知道它是怎么回事。

echo 'string1;string2"string3";string4' | awk -F'[;"]' '{print $3}'

所以上面通过在awk中提到-F选项来创建多个分隔符然后我将分隔符设置为chars(;“),那么string3将是第3个字段,你可以合并你的awk。我希望这可以帮助你。

编辑:抱歉MODs /所有,我是这个网站的新手,所以我为这个问题的答案添加了另一种选择。 谢谢Questionmark,它鼓励我。因此,如果您的字符串中只出现两次",并且您想要删除此分隔符,那么以下内容可以帮助您:

echo 'string1;string2"string3";string4' | awk '{match($0,/\".*\"/);print substr($0,RSTART+1,RLENGTH-2)}'

在上面的代码中,我使用awk的匹配功能匹配正则表达式,所以一旦它匹配特定字符串,那么我打印特定匹配(其中RSTARTRLENGTH是内置的在awk中仅在内部设置的变量中,正则表达式匹配为TRUE,因此它们被打印出来。我希望这也会有所帮助。