为什么此示例的输出中的字段没有用空格分隔?

为什么此示例的输出中的字段没有用空格分隔?

申请时

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

  1. -F'[,/]'将字段分隔符更改FS,/,以便 awk 读取输入。

    OFS默认情况下是一个空格。那么什么时候print $0,不是所有的字段$1,...,并$NF用分隔符连接起来OFS创建呢 $0

  2. 改变

    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

  3. 如果必须更改某个字段以便$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

华泰

相关内容