我的线条看起来像这样
123-456-789 12.34.56 example
我想选择 12,添加 2,然后按原样打印整行。所以结果应该是:
123-456-789 14.34.56 example
我有这个 awk 表达式:
awk 'BEGIN {FS="[ .]"}{$2=$2+2}{print}'
但它给了我
123-456-789 14 34 56 example
点消失了,取而代之的是空格。
答案1
awk '{ split($2,a,"\."); a[1]+=2; $2=sprintf("%d.%d.%d", a[1],a[2],a[3]) } 1' file
或者,
awk '{ split($2,a,"\."); $2=sprintf("%d.%d.%d", a[1] + 2,a[2],a[3]) } 1' file
这会将行读取为一组空格分隔的字段。它将第二个字段按点分割,并将结果的第一部分加 2。然后,在打印结果记录之前,它将第二个字段重新形成为三个点分隔的整数(打印是由末尾的 完成的,1
这是一种快捷方式{ print }
)。
这假设我们知道第二条记录确实是三个点分隔的整数。
我会这样做,因为它所发生的事情非常明确,因此易于理解和维护。
答案2
尝试去 ”恢复" 复杂/复合字段分隔符可能会破坏某些值和整个记录的一致性。
相反,请使用以下方法:
awk '{ n = substr($2, 1, index($2, ".")); sub(/[^.]+\./, n + 2 ".", $2) }1' file
输出:
123-456-789 14.34.56 example
上面的命令将使用空格作为默认字段分隔符,并$2
仅对第二个字段执行所有需要的处理。
答案3
在脚本中使用允许捕获字段分隔符的split
函数:awk
awk '{split($0,a,"[- .]",sep); a[4]+=2; for(i in a) printf "%s%s",a[i], sep[i]; printf "\n"}' file
或者,您可以使用RS
和RT
变量
awk -v RS='[- .]' 'NR==4{$1+=2} {printf "%s%s",$0,RT}' file <<< '123-456-789 12.34.56 example'
请注意,最后一个仅适用于单行。
答案4
与 gensub 的 gawk 一起
gawk '{sub(/[^.]*/,gensub(/([^.]*).*/,"\\1",1,$2)+2,$2)}1' infile