我正在寻找一个 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