使用awk和Bash在文本文件中添加数字

使用awk和Bash在文本文件中添加数字,bash,awk,Bash,Awk,我需要把所有出现在图书索引中的数字加上22。索引数据如下所示(例如): 我正在使用以下脚本尝试使用awk执行此操作: #!/bin/bash filename="index" while read -r line do echo $line | awk -v n=22 '{printf($1)}{printf(" " )}{for(i=2;i<=NF;i++)printf(i%2?$i+n:$i+n)", "};{print FS}' done < "$filename"

我需要把所有出现在图书索引中的数字加上22。索引数据如下所示(例如):

我正在使用以下脚本尝试使用awk执行此操作:

#!/bin/bash

filename="index"
while read -r line
do
    echo $line | awk -v n=22 '{printf($1)}{printf(" " )}{for(i=2;i<=NF;i++)printf(i%2?$i+n:$i+n)", "};{print FS}'
done < "$filename"
#/bin/bash
filename=“index”
而read-r行
做
echo$line | awk-vn=22'{printf($1)}{printf(“”)}{for(i=2;i例如:

Ubuntu, 120, 143, 154
Yggdrasil, 144, 170-171
Yood, Charles, 6
Young, Bob, 178-179
Zawinski, Jamie, 204
perl -plE 's/\b(\d+)\b/$1+22/ge' index
输出

Ubuntu, 142, 165, 176
Yggdrasil, 166, 192-193
Yood, Charles, 28
Young, Bob, 200-201
Zawinski, Jamie, 226

但它不是
awk

您可以使用以下gnu awk命令:

awk 'BEGIN {FS="\f";RS="(, |-|\n)";} /^[0-9]+$/ {$1 = $1 +22} { printf("%s%s", $1, RT);}' yourfile
  • FS
    RS
    有点滥用,让awk将每行中的每个令牌作为其自己的记录来处理,因此您不必在 字段并测试每个字段是否为数字字段
  • RS=“(,|-|\n)”
    将破折号、换行符和“,”配置为记录分隔符
  • 在仅由数字组成的“记录”上:添加22
  • printf
    将标记与其
    RT
    一起打印,以从文件中重建行

    • 考虑使用以下
      awk
      脚本(
      add\u number.awk
      ):

      输出:

      Ubuntu, 142, 165, 176
      Yggdrasil, 166, 192-193
      Yood, Charles, 28
      Young, Bob, 200-201
      Zawinski, Jamie, 226
      

      对于多字符RS和RT,使用GNU awk:

      $ awk -v RS='[0-9]+' '{ORS=(RT=="" ? "" : RT+22)}1' file
      Ubuntu, 142, 165, 176
      Yggdrasil, 166, 192-193
      Yood, Charles, 28
      Young, Bob, 200-201
      Zawinski, Jamie, 226
      

      整洁又漂亮。唯一可能的陷阱是标题中还包含一个数字(即Sed和Awk 100 hacks:100将完成122)@GeorgeVasiliou true:)还将更改每个LaTEX字体大小,比如…;)太棒了!Perl也可以工作。谢谢。这对我来说很有用。谢谢大家的回答——awk脚本也很有意义,但我喜欢这个优雅的一行Perl解决方案,因为它的简单性。我测试了你的解决方案,非常棒。但是ORS=RT+22似乎也可以工作……对吗?谢谢s、 不,这将在输出的enc处打印
      22
      ,因为当文件末尾的RT为null时,它会将ORS设置为null+22。
      Ubuntu, 142, 165, 176
      Yggdrasil, 166, 192-193
      Yood, Charles, 28
      Young, Bob, 200-201
      Zawinski, Jamie, 226
      
      $ awk -v RS='[0-9]+' '{ORS=(RT=="" ? "" : RT+22)}1' file
      Ubuntu, 142, 165, 176
      Yggdrasil, 166, 192-193
      Yood, Charles, 28
      Young, Bob, 200-201
      Zawinski, Jamie, 226