gpt4 book ai didi

regex - AWK:如果这是一个正则表达式,有没有办法将 OFS 设置为 FS?

转载 作者:行者123 更新时间:2023-12-04 14:24:38 25 4
gpt4 key购买 nike

在 awk 中,字段(或记录)分隔符 FS (或 RS )可以设置为正则表达式。
它适用于获取任何单个字段,但是一旦您设置了这些字段,字段分隔符就会“消失”。

echo "a|b-c|d" | awk 'BEGIN{FS="[|-]"} {$3="z"}1'
a b z d

在这种情况下,输出字段分隔符 OFS默认设置为空格。

可惜这种说法 OFS=FS="[|-]"不起作用,因为它设置了 OFS作为一个字串。

我知道如果有多种选择,awk 选择输出字段分隔符可能会变得棘手,但如果没有新字段,则可以保留当前字段。

那么,是否有一种简单的方法来设置 OFSFS 完全相同的正则表达式,这样我就明白了?
echo "a|b-c|d" | awk '... {$3="z"}1'
a|b-z|d

或者,有没有办法捕获所有分隔符,例如在数组中?

同样的问题也适用于记录分隔符 RS (及其关联的 ORS )

最佳答案

正如您已经提到的,无法设置 OFS动态基于 FS这在每个案例中都使用过。如果正则表达式在 RS而不是 FS ,您可以使用 RT (事实上​​,我只是看到 anubhava 的回答就是这样做的,很好!)。

但是,如果您有 GNU awk,还有另一种方法:如 column replacement with awk, with retaining the format (Ed Morton's answer) 中所示,您可以使用 split() 特别是它的第四个参数。为什么?因为它存储了每个切片之间的分隔符:

gawk 'BEGIN{FS="[|-]"}                     # set FS
{split($0, a, FS, seps) # split based on FS and ...
# ... store pieces in the array seps()
a[3]="z" # change the 3rd field
for (i=1;i<=NF;i++) # print the data back
printf "%s%s", a[i], seps[i] # keeping the separators
print "" # print a new line
}'

作为单线:
$ gawk 'BEGIN{FS="[|-]"} {split($0, a, FS, seps); a[3]="z"; for (i=1;i<=NF;i++) printf "%s%s", a[i], seps[i]; print ""}' <<< "a|b-c|d"
a|b-z|d

split(string, array [, fieldsep [, seps ] ])

Divide string into pieces separated by fieldsep and store the pieces in array and the separator strings in the seps array. The first piece is stored in array1, the second piece in array2, and so forth. The string value of the third argument, fieldsep, is a regexp describing where to split string (much as FS can be a regexp describing where to split input records). If fieldsep is omitted, the value of FS is used. split() returns the number of elements created. seps is a gawk extension, with seps[i] being the separator string between array[i] and array[i+1]. If fieldsep is a single space, then any leading whitespace goes into seps[0] and any trailing whitespace goes into seps[n], where n is the return value of split() (i.e., the number of elements in array).

关于regex - AWK:如果这是一个正则表达式,有没有办法将 OFS 设置为 FS?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39326013/

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