awk 只打印修改过的行

Sol*_*osa -1 awk search text-processing replace

我有这样的文件

d1000 1000
d1001 100
d1002 10
d1003 1
Run Code Online (Sandbox Code Playgroud)

我想修改长度不等于 4 的第二列。但我只想打印修改的行,因此第 2 列中的原始文本保留在 coulmn 2 中,更改打印在第三列中,并递增到一个数字。

期望的输出:

d1001 100 1101
d1002 10  1102
d1003 1  1103
Run Code Online (Sandbox Code Playgroud)

我正在尝试按照这些思路,但无法获得语法或结果

awk -v n=1100 '((length($2)!=4 && length($2)>0) {new=($2=++n)}; {print $1, $2, new}' file
Run Code Online (Sandbox Code Playgroud)

tha*_*isp 5

您可以像这样print在现有行 ( $0) 和新字段中,使用参数之间的输出分隔符。

awk -v n=1100 'length($2)!=4 {print $0,++n}' file
Run Code Online (Sandbox Code Playgroud)

输出:

d1001 100 1101
d1002 10 1102
d1003 1 1103
Run Code Online (Sandbox Code Playgroud)

如果您需要对输出进行任何其他格式化,可以使用printf函数。这是对齐的示例:

$ awk -v n=1100 'length($2)!=4 {printf "%s %4s %s\n", $1, $2, ++n}' file
d1001  100 1101
d1002   10 1102
d1003    1 1103
$ awk -v n=1100 'length($2)!=4 {printf "%s %-4s %s\n", $1, $2, ++n}' file
d1001 100  1101
d1002 10   1102
d1003 1    1103
Run Code Online (Sandbox Code Playgroud)