如何将 gsub 与 awk 结合使用来应用于所有字符串

如何将 gsub 与 awk 结合使用来应用于所有字符串

我尝试使用gsubwithawk应用于所有字符串,但失败了。

gsub(/^ *| *$/,"", $4);

我不想将其应用于 string $4,而是想将其应用于所有字符串。我尝试过$0但失败了。

怎么了?

awk '{ 
     split($12, a, /[/:]/); 
     if (length(a[2]) == 1) $12=sprintf("%s:%02d/%d", a[1], a[2], a[3]);
     gsub(/^ *| *$/,"", $0);
     print $9, $12, $10, $2, $3, $4, $5, $6, $7, $8, $13 
 }' FS='|' OFS=',' file

例子

|f_name:x|l_name:x| address:x x | city:x |state:x|zip:x|country:x|ordernumber:x|code:x|downloaded:x| exp:9/2017|ip:x.x.x.x|

输出

ordernumber:x,exp:09/2017,code:x,f_name:x,l_name:x,address:x x,city:x,state:x,zip:x,country:x,ip:x.x.x.x

答案1

循环从1NF并引用字段$i(或任何您用来命名循环计数器的内容)。语法类似于C:

for (i = 1 ; i <= NF ; i++) {
    ...
}

例如

$ echo "  foo bar  :doh : bla:" |awk -vOFS=: -F: '
    { for (i = 1 ; i <= NF ; i++) gsub(/^ +| +$/, "", $i) } 1'
foo bar:doh:bla:

(我改为/^ */as/^ +/似乎mawk忽略了^前者中的。)

答案2

如果您想要做的只是从每个字段中删除空格(其中字段由字符“|”分隔),那么只需更改字段分隔符以包含该空格即可。假设您的 awk 支持正则表达式作为字段分隔符,请将您的FS='|'设置替换为

FS=' *\\| *'

请注意,需要转义,|因为字符串现在是一种模式。

这不处理第一个字段开头和最后一个字段结尾处的空格。您可以在这些上使用sub(/^ */,"",$1)and sub(/ *$/,"",$NF)

相关内容