如何更改脚本的一部分的 awk 分隔符?
Posted
技术标签:
【中文标题】如何更改脚本的一部分的 awk 分隔符?【英文标题】:How can I change the awk delimiter for a part of my script? 【发布时间】:2017-05-07 08:25:49 【问题描述】:我有一个格式如下的输入字符串:
string1;string2"string3";string4
我想使用awk
解析这个文件以获取string3
的值。为此,我可以先用;
分隔,打印第二段,然后用"
分隔并打印第二段。使用管道的示例:
$ echo 'string1;string2"string3";string4' | awk -F\; 'print $2' | awk -F\" 'print $2';
string3
我想将它组合成一个awk
命令,但我不知道如何在我的命令期间更改字段分隔符。我可以在awk
中使用语法来更改分隔符吗?
【问题讨论】:
如果你真的只想得到string3
观察,当输入由"
分隔时,string3
是$2
所以你用awk -F\" 'print $2'
得到它
【参考方案1】:
您可以在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数组中。
【讨论】:
酷!在split
函数上添加一点文档怎么样?:split(string, array [, fieldsep [, seps ] ])
酷,我从未见过在awk
上使用split
函数。【参考方案2】:
您能否尝试关注并告诉我情况如何。
echo 'string1;string2"string3";string4' | awk -F'[;"]' 'print $3'
所以上面是通过在 awk 中提到 -F 选项来创建多个分隔符,然后我将分隔符设置为 chars(; ") 所以 string3 将是第三个字段,你可以像这样合并你的 awk。我希望这对你有帮助。
编辑:道歉MODs/all,我是这个网站的新手,所以我为这个问题的答案添加了另一种选择。
谢谢你的问号,它鼓励了我。因此,如果您的字符串中只有两次出现 "
并且您想摆脱此分隔符,那么以下内容可以帮助您:
echo 'string1;string2"string3";string4' | awk 'match($0,/\".*\"/);print substr($0,RSTART+1,RLENGTH-2)'
在上面的代码中,我使用 awk 的匹配功能匹配正则表达式,所以一旦它匹配特定的字符串,我就会打印特定的匹配项(其中 RSTART
和 RLENGTH
是 awk 中的内置变量只有在里面时才会设置,正则表达式匹配是TRUE
,所以它们被打印出来了。我希望这也会有所帮助。
【讨论】:
欢迎来到本站!该命令在这种情况下有效(因此投赞成票),但是,它没有回答如何使用一个又一个分隔符...另一个答案是正确答案,但您的答案确实有效... 没有理由在常量正则表达式中转义双引号,它们已经只是文字字符。请注意,您的答案将找到记录中第一个引号和最后一个引号之间的子字符串(可能跨越多个字段),而不是按照要求在$2
中找到第一个引用的字符串。以上是关于如何更改脚本的一部分的 awk 分隔符?的主要内容,如果未能解决你的问题,请参考以下文章