Bash awk FS是一个正则表达式

Bash awk FS是一个正则表达式,bash,awk,Bash,Awk,我的问题是无法将处理过的文件以FS集作为正则表达式输出。 我有一个文件需要处理: id 1:1 2:1 3:2 5:1 id 1:2 3:1 4:1 其中,我想将“:”之后的值乘以2: id 1:2 2:2 3:4 5:2 id 1:4 3:2 4:2 我试过: awk 'BEGIN {FS=" [[:digit:]]+:"}{OFS=FS}{for (i=2; i<=NR;i++) $i=$i*2; print}' file 但是,它给了我文本[[:digit:]+]:作为FS。我

我的问题是无法将处理过的文件以FS集作为正则表达式输出。 我有一个文件需要处理:

id 1:1 2:1 3:2 5:1
id 1:2 3:1 4:1
其中,我想将“:”之后的值乘以2:

id 1:2 2:2 3:4 5:2
id 1:4 3:2 4:2
我试过:

awk 'BEGIN {FS=" [[:digit:]]+:"}{OFS=FS}{for (i=2; i<=NR;i++) $i=$i*2; print}' file
但是,它给了我文本[[:digit:]+]:作为FS。我在这里提出了一个类似的问题,并尝试将字段设置为记录,最后打印$0,RT,但它也不起作用

谢谢您的提示。

您可以使用拆分功能

您可以使用拆分功能


使用gawk,您可以在split函数的gawk only额外参数中捕获类似于RT的字段分隔符:

BEGIN {FS=" [[:digit:]]+:"}

{
    split($0,a,FS,seps);
    printf "%s", a[1];
    for (i=2; i<=length(a); ++i)
      {printf "%s%s", seps[i-1], a[i]*2}
    print ""
}

$ awk -f mirr.awk mirr.txt
id 1:2 2:2 3:4 5:2
id 1:4 3:2 4:2

使用gawk,您可以在split函数的gawk only额外参数中捕获类似于RT的字段分隔符:

BEGIN {FS=" [[:digit:]]+:"}

{
    split($0,a,FS,seps);
    printf "%s", a[1];
    for (i=2; i<=length(a); ++i)
      {printf "%s%s", seps[i-1], a[i]*2}
    print ""
}

$ awk -f mirr.awk mirr.txt
id 1:2 2:2 3:4 5:2
id 1:4 3:2 4:2

您使用的是哪种awk?@JamesBrown这没关系,您不能将OFS设置为未知数字。@123不要破坏它。我只读了第一句话d你用的是哪种awk?@JamesBrown在那个里没关系,你们不能将OFS设置为未知数字。@123别破坏它。我只读了第一句话D@Sundeep,为什么最后的1?@airos任意非零数字在awk中计算为true,如果在打印条件后未指定块,则默认操作为true。所以基本上它只打印行。@Sundeep,为什么最后的1?@airos任何非零数字在awk中计算为true,如果在打印条件后未指定块,则默认操作为true。所以基本上它只是打印线条。
BEGIN {FS=" [[:digit:]]+:"}

{
    split($0,a,FS,seps);
    printf "%s", a[1];
    for (i=2; i<=length(a); ++i)
      {printf "%s%s", seps[i-1], a[i]*2}
    print ""
}

$ awk -f mirr.awk mirr.txt
id 1:2 2:2 3:4 5:2
id 1:4 3:2 4:2