gpt4 book ai didi

awk - 是否有一个字段可以存储在正则表达式中使用的确切字段分隔符 FS,相当于 RS 的 RT?

转载 作者:行者123 更新时间:2023-12-03 15:01:18 24 4
gpt4 key购买 nike

GNU Awk's 4.1.2 Record Splitting with gawk 我们可以读到:

When RS is a single character, RT contains the same single character. However, when RS is a regular expression, RT contains the actual input text that matched the regular expression.


此变量 RTsome cases 中非常有用.
同样,我们可以设置一个正则表达式作为字段分隔符。例如,在这里我们允许它是“;”或“|”:
$ gawk -F';' '{print NF}' <<< "hello;how|are you"
2 # there are 2 fields, since ";" appears once
$ gawk -F'[;|]' '{print NF}' <<< "hello;how|are you"
3 # there are 3 fields, since ";" appears once and "|" also once
但是,如果我们想再次打包数据,我们没有办法知道两个字段之间出现了哪个分隔符。因此,如果在前面的示例中,我想遍历字段并使用 FS 再次将它们打印在一起。 ,它在每种情况下都打印整个表达式:
$ gawk -F'[;|]' '{for (i=1;i<=NF;i++) printf ("%s%s", $i, FS)}' <<< "hello;how|are you"
hello[;|]how[;|]are you[;|] # a literal "[;|]" shows in the place of FS
有没有办法使用用于拆分每个字段的特定字段分隔符来“重新打包”字段,类似于 RT 允许做的事情?
(问题中给出的例子相当简单,但只是为了说明这一点)

最佳答案

Is there a way to "repack" the fields using the specific field separator used to split each one of them


使用 gnu-awk split() 使用提供的正则表达式为匹配的分隔符提供额外的第四个参数:
s="hello;how|are you"
awk 'split($0, flds, /[;|]/, seps) {for (i=1; i in seps; i++) printf "%s%s", flds[i], seps[i]; print flds[i]}' <<< "$s"

hello;how|are you
一个更易读的版本:
s="hello;how|are you"
awk 'split($0, flds, /[;|]/, seps) {
for (i=1; i in seps; i++)
printf "%s%s", flds[i], seps[i]
print flds[i]
}' <<< "$s"
留意第四条 seps split 中的参数通过第三个参数中使用的正则表达式存储匹配文本的数组,即 /[;|]/ .
当然,它不像 RS那么短而简单。 , ORSRT ,可以写成:
awk -v RS='[;|]' '{ORS = RT} 1' <<< "$s"

关于awk - 是否有一个字段可以存储在正则表达式中使用的确切字段分隔符 FS,相当于 RS 的 RT?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65560326/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com