如何更改脚本的一部分的 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 的匹配功能匹配正则表达式,所以一旦它匹配特定的字符串,我就会打印特定的匹配项(其中 RSTARTRLENGTH 是 awk 中的内置变量只有在里面时才会设置,正则表达式匹配是TRUE,所以它们被打印出来了。我希望这也会有所帮助。

【讨论】:

欢迎来到本站!该命令在这种情况下有效(因此投赞成票),但是,它没有回答如何使用一个又一个分隔符...另一个答案是正确答案,但您的答案确实有效... 没有理由在常量正则表达式中转义双引号,它们已经只是文字字符。请注意,您的答案将找到记录中第一个引号和最后一个引号之间的子字符串(可能跨越多个字段),而不是按照要求在$2 中找到第一个引用的字符串。

以上是关于如何更改脚本的一部分的 awk 分隔符?的主要内容,如果未能解决你的问题,请参考以下文章

Linux20180427

26期20180705 awk

26期20180705 awk

shell编程

linux shell awk 如何区分空格和tab

(shell脚本)特殊分隔符文本文件导入MongoDB