awk 只打印修改过的行

awk 只打印修改过的行

我有这样的文件

d1000 1000
d1001 100
d1002 10
d1003 1

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

期望的输出:

d1001 100 1101
d1002 10  1102
d1003 1  1103

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

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

答案1

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

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

输出:

d1001 100 1101
d1002 10 1102
d1003 1 1103

如果您需要输出的任何其他格式,您可以使用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

答案2

awk -v k=1100 '{if(length($2) !=4  && length($2)>0){k=k+1;print $1,$2,k }}' file.txt 

输出

d1001 100 1101
d1002 10 1102
d1003 1 1103

答案3

使用(以前称为 Perl_6)

raku -ne 'state $i; if .words[1].match( /^ \d**0..3 $/ ) { print .words~" "; put ++$i + 1100 };'  

这个问题与最近的一个问题类似,您可以稍微修改该问题的 Raku 答案。

简而言之(与上一个问题相比),询问if .words[1]第二列是否可以匹配只包含\d**0..3零到三位数字的字符串,如果是,则打印出 all .words,然后是返回计数器的第三列$i,从1100通过 递增的基础值++

输入示例:

d1000 1000
d1001 100
d1002 10
d1003 1

示例输出:

d1001 100 1101
d1002 10 1102
d1003 1 1103

https://unix.stackexchange.com/a/703436/227738
https://raku.org

相关内容