申请时
awk -F'[,/]' '{sub(/\/[0-9]+/, "/" ($2+3) ); print $0}'
输入
Statements and Functions/399,Black,notBold
为什么输出是
Statements and Functions/402,Black,notBold
代替
Statements and Functions 402 Black notBold
?
-F'[,/]'
将字段分隔符更改FS
为,
或/
,以便 awk 读取输入。OFS
默认情况下是一个空格。那么什么时候print $0
,不是所有的字段$1
,...,并$NF
用分隔符连接起来OFS
创建呢$0
?改变
awk -F'[,/]' '{sub(/\/[0-9]+/, "/" ($2+3) ); print $0}'
到
awk -F'[,/]' '{sub(/\/[0-9]+/, "/" ($2+3) ); $1=$1; print $0}'
将输出
Statements and Functions 402 Black notBold
用于输入
Statements and Functions/399,Black,notBold
那么还有什么其他情况(除了分配给一个字段)
$0
可以用 重新格式化OFS
?如果必须更改某个字段以便
$0
将其重新格式化OFS
,那么为什么awk -F'[,/]' '{sub(/\/[0-9]+/, "/" ($2+3) ); print $0; print $2; print $0}'
适用于输入
Statements and Functions/399,Black,notBold
输出显示值发生
$2
变化,而$0
不受OFS
?的影响。Statements and Functions/402,Black,notBold 402 Statements and Functions/402,Black,notBold
答案1
您必须确信awk
字段已更改,以迫使其重新格式化它们OFS
。如果您$0
像您的情况一样对整体进行替换,则awk
不需要将其分成几部分并重新格式化。
你可以做这样的事情来让它接受事情已经改变:
awk -F'[,/]' '{sub(/\/[0-9]+/, "/" ($2+3) ); $1=$1; print $0}'
这$1=$1
确实有效:)
请注意,sub()
不会更改$2
- 它会扫描并更改$0
并使用 的值更新它$2+3
。但它不会更新$2
,它会更新$0
,因此不会触发重新格式化。
答案2
我相信通过使用以下方式您会得到更好的服务:
awk -F'[,/]' '{$2=($2+3)}1' infile
infile 如下:
$ cat infile
The Ubiquitous Backslash/49,Black
The Ubiquitous Backslash/17,Black
Statements and Functions/399,Black,notBold
你会得到:
$ awk -F'[,/]' '{$2=($2+3)}1' infile
The Ubiquitous Backslash 52 Black
The Ubiquitous Backslash 20 Black
Statements and Functions 402 Black notBold
华泰