Bash 脚本仅将文本文件中的数字相乘?

Bash 脚本仅将文本文件中的数字相乘?

我正在寻找一个 bash 命令,它只能将文本文件中的数字相乘。以下是我的文本文件的内容。我需要将所有数字乘以 100。

    0 4530000 sil
4530000 11100000 ow
11100000 6320000 p
6320000 7600000 ah
7600000 8410000 n
8410000 12100000 sil

对于只有数字的单行,我使用如下所示的内容

for file in *.txt; \
do y=`sed -n '1 p' "$file"`;
   z=$(bc<<<"$y*100")
   sed $file -i -e 's/'"$y"'/'"$z"'/'
done

但我不知道如何对多行执行此操作,其中包含字母。我的文件中的行数不固定,每个文件都有不同的行数,最大为 8

答案1

可以使用perl

perl -pe 's/\b(\d+\.)?\d+\b/$&*100/ge' file

答案2

对于整数,将所有数字乘以 100 意味着如果 >0,则在每个数字的末尾添加 00。

sed 's/[1-9][0-9]*/&00/g' infile

答案3

使用 GNU 或busybox awk,识别诸如 , 之类的1.2数字.123e-4

awk -v CONVFMT=%.19g \
    -v RS='\\<[0-9]*\\.?[0-9]+([eE][-+]?[0-9]+)?\\>' \
    -v ORS= 'RT != "" {RT *= 100}; {print $0 RT}'

您可能需要适应CONVFMT数字的格式。

答案4

您可以使用 awk。将其保存为 parse.awk:

{
  for (i = 1; i <= NF; ++i) {
    number = match($i, /[0-9]+(\.[0-9]+)?/)
    printf number? "%g " : "%s ", number? $i * 100 : $i
  }
  printf "\n"
}

然后运行:

awk -f parse.awk file

或者如果你想要一行:

awk '{for(i=1;i<=NF;++i){n=match($i,/[0-9]+(\.[0-9]+)?/);printf n?"%g ":"%s ",n?$i*100:$i} printf"\n"}' file

相关内容