我想将文本文件中的所有数字缩写(如1k、100k、1m等)转换为纯数字值(如1000、100000、1000000等)。
例如,如果我有以下文本文件:
1.3K apples
87.9K oranges
156K mangos
541.7K carrots
1.8M potatoes
我想在bash中将其转换为以下内容:
1300 apples
87900 oranges
156000 mangos
541700 carrots
1800000 potatoes
我使用的命令是将匹配的数字缩写字符串替换为完整的数字值,如下所示:
sed -e 's/1K/1000/g' -e 's/1M/1000000/g' text-file.txt
我的问题是,当发生变化时,我无法找到并替换所有可能的数字缩写。我想这样做,直到至少有一个十进制缩写。
9条答案
按热度按时间wlwcrazw1#
鉴于:
只是为了傻笑,纯粹的bash(sed和bc):
印刷品:
p5cysglq2#
这将执行全局替换(如果每行有>1个字符串要转换):
wqsoz72f3#
使用
numfmt
从GNUCoreutils,不要重新发明轮子。如果缩写数字可能显示为任何字段,则可以使用:
nukf8bse4#
另一个
awk
变体:pprl5pva5#
以编程的方式,基于这个答案,您可以创建所有可能的转换因子的列表,并在需要时执行乘法:
x8diyxa76#
gnu awk for gensub():
l2osamch7#
你能试着用gnu里的样品来写,测试一下吗
awk
.说明:增加了对以上内容的详细说明。
输出如下。
kb5ga3dv8#
这可能适用于您(gnu-sed):
创建查找并将其存储在保留空间中。
将查找附加到每行,并使用模式匹配将查找中的键替换为其值。
最后在没有找到匹配项时打印行。
e5nszbig9#
另一种选择可能是仅使用bash和带有捕获组的模式,您可以在其中捕获任意一个组
M
或者K
. 如果模式匹配,则测试其中一个并设置乘数和使用bc
```while IFS= read -r line
do
if $line =~ ^(:digit:+(.:digit:+)?)([MK])( .*)$ ;then
echo "$(bc <<< "${BASH_REMATCH[1]} * $([ ${BASH_REMATCH[3]} == "K" ] && echo "1000" || echo "1000000") / 1")${BASH_REMATCH[4]}"
fi
done < text-file.txt
1300 apples
87900 oranges
156000 mangos
541700 carrots
1800000 potatoes