2

这可能是一个愚蠢的问题,但我从来没有在脚本中遇到过这样的事情。所以任何帮助将不胜感激。

我正在处理来自人口普查的数据,并且必须生成报告。文件中的每一行都有一个姓氏、频率等。我必须抓住频率。但是,如果我抓住一些频率为“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
4

2 回答 2

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 }'
于 2013-10-14T04:04:56.300 回答
0
  1. 选择一个贝壳。Bourne Again Shell (bash) 和基本的 /bin/sh 都很流行。您不应该使用许多其他选项。

  2. 具体建议。谷歌。真的。请参阅比较 Unix中的字符串以获得答案,或如何比较 Bourne Shell 中的字符串?如果使用 bash。

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

  4. 注意空替换。 if [ $nosuchvar = 3 ]出错但if [ "$nosuchvar" = 3 ]没有。此外,全局替换,因此if [[ $foo == "a*" ]]不同于if [ $foo == "a*" ]

  5. 倾倒外壳。运行 Python 或其他“真正的”语言通常比超过 5 行的任何 shell 脚本更简洁、更易于维护。

于 2013-10-14T02:54:21.957 回答