我有这样的文件
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