2013-10-14 76 views
2

这可能是一个愚蠢的问题,但我从来没有在脚本编写中这样做过。所以任何帮助,将不胜感激。使用if语句比较shell中的两个字符串

我正在处理人口普查数据,必须生成报告。 文件中的每一行都有姓氏,频率等等,我必须抓住频率。 但是,如果我抓住一些频率为“0.000”的姓氏,那么我必须将其更改为“0.00025”。我试图做一个if语句,但不知道如何去做。

#!/bin/bash 
all=/homes/ddailey/public_html/data/dist_all_last 

count=`grep -w $1 $all | awk '{ print $2 }'` 

if [ $count == "0.000" ]; then 
    echo .00025 
else 
    echo $count 
fi 
+0

这并不完美,但它看起来应该按照你的描述进行。它有什么问题? – kojiro

+0

是的,我知道它不完美,只需几分钟就把它放在一起。问题是,如果$ count greps一个0.000的字符串,它不会将其更改为.00025。它只是保持在0.000 – Sampson

+0

正如书面它不应该改变'计数'的价值,但它应该*回声* .00025。它是否这样做? – kojiro

回答

0
  1. 选择一个壳。 Bourne Again Shell(bash)和basic/bin/sh都很受欢迎。还有其他一些你不应该使用的选项。

  2. 具体的建议。谷歌。真。如果使用bash,请参阅Compare a string in UnixHow do I compare strings in Bourne Shell?

  3. 观察空间。 Shell编程对空白区域很敏感,因此有或忘记空格会破坏脚本。例如,确保您记住'['或']'前后的空格。运行它通常涉及添加和删除空格。

  4. 注意空替换。 if [ $nosuchvar = 3 ]发生错误,但if [ "$nosuchvar" = 3 ]没有。另外,glob替换,所以if [[ $foo == "a*" ]]if [ $foo == "a*" ]不同

  5. 转储shell。运行Python或其他“真实”语言通常比五行以上的任何shell脚本更清洁,更易维护。

1

第一条语句

count=`grep -w $1 $all | awk '{ print $2 }'` 

是返回由换行分隔值的列表。一个简单的echo将不会显示新行,但这样会:

echo "$count" 

if声明,然而,要求单一值,所以如果你有两个或两个以上的结果$count它不会匹配的单一测试值。你需要做的是循环访问$count中的值。请尝试以下操作:

counts=`grep -w $1 $all | awk '{ print $2 }'` 
for count in $counts 
do 
    if [ $count == "0.000" ]; then 
     echo .00025 
    else 
     echo $count 
    fi 
done 

我更喜欢将以下设计将所有逻辑放入awk命令。这将所有的处理逻辑保存在一个脚本中,而不是在awk和bash之间进行分割。

grep -w $1 $all | 
awk '{ if ($2 == "0.000") $2 = "0.00025"; print $2 }'