AWK:如果这个是正则表达式,有没有办法将OFS设置为FS?
在awk中,字段(或记录)分隔符FS(或RS)可以设置为正则表达式.
echo "a|b-c|d" | awk 'BEGIN{FS="[|-]"} {$3="z"}1' a b z d 在这种情况下,输出字段分隔符OFS默认设置为空格. 不幸的是,这种语句OFS = FS =“[| – ]”不起作用,因为它将OFS设置为一个字符串. 我知道如果有多个选择,awk选择输出字段分隔符可能会变得棘手,但是如果没有新字段,则可以保留当前的字段. 那么,是否有一种简单的方法可以将OFS设置为与FS完全相同的正则表达式,这样我就可以得到它? echo "a|b-c|d" | awk '... {$3="z"}1' a|b-z|d 或者,有没有办法捕获数组中的所有分隔符? 同样的问题也适用于记录分隔符RS(及其相关的ORS) 解决方法正如您已经提到的,没有办法根据每种情况下使用的FS动态设置OFS.如果正则表达式是RS而不是FS,你可以使用RT(事实上,我只是看到anubhava的答案就是这样,很好!).但是,如果你有GNU awk还有另一种方法:如column replacement with awk,with retaining the format (Ed Morton’s answer)所示,你可以使用 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,seps); a[3]="z"; for (i=1;i<=NF;i++) printf "%s%s",seps[i]; print ""}' <<< "a|b-c|d" a|b-z|d
(编辑:威海站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |