如何在 bash 中用相应的字符串(低/高)替换数字?

如何在 bash 中用相应的字符串(低/高)替换数字?

我有一个文件:

property(Address1, 4.5)
property(Address2, 2.2)
property(Address3, 9.0)
property(Address4, 3.4)
---

我想根据某些条件替换浮点数(例如:如果数字在 2 到 4 之间,我将用 Low 替换它,否则用 High 替换)以产生以下结果:

property(Address1, High)
property(Address2, Low)
property(Address3, High)
property(Address4, Low)
---

我的尝试:(1)首先使用 $ 提取数字。 (2) 检查条件是否满足(3),然后打印。但在此过程中,我无法将 Address* 输出到输出文件。

答案1

这(严格)满足您的要求:

awk '{ print $1, (($2>2)&&($2<4))?"Low)":"High)" }'

但它利用了这样一个事实,即 awk 将像这样的字符串9.0)(带有尾随括号)转换为数字9。例如,如果添加空格,则可能会失败。

更严格的解决方案是还使用右括号作为字段分隔符,将其从字段 number 的内容中删除2

awk -F'[ )]' '{print $1,(($2>2)&&($2<4))?"Low)":"High)"}'

答案2

我尝试过 if 和 else 条件

sed "s/)$//g" filename| awk '{if($2 > 2 && $2 < 4) {$2="low)";print $0}else{$2="high)";print $0}}'
    property(Address1, high)
    property(Address2, low)
    property(Address3, high)
    property(Address4, low)

答案3

对于perl,假设数字采用 格式[-]<digits>[.<digits>],并在输入中的任何位置匹配它们,只要它们前面或后面都没有单词字符(因此Address1不会更改为AddressHigh例如):

<input perl -pe 's{(?<!\w)-?\d[\d.]*(?!\w)}{$& >=2 && $& <=4 ? "Low" : "High"}ge'

相关内容