如何在读取循环中获取确切的行数?

时间:2014-06-19 20:56:24

标签: bash shell

我在shell脚本中使用了一个while循环来逐行计数和编号我的file.txt。现在我想在循环内给出确切的行数,就像我命令wc -l一样。以下是我的剧本。

#!/bin/bash

  let count=0
  while read cdat ctim clat clon
       do
          h=${ctim:0:2};    # substring hours from ctim
          m=${ctim:3:2};
          s=${ctim:6:2};
          # echo $j
          if [[ $h>=11 ]]; then
              if [[ $h<=18 ]] && [[ $s<=00 ]]; then
                  if [[ $m != 01 ]]; then # spaces around "!=" is necessary
                      echo "$count $LINE" $cdat $ctim $clat $clon  
                      let count=$count+1
                  fi
              fi 
          fi
       done  <  cloud.txt 
  exit

输出包含如下行:

0  2014/04/00 14:44:00 26.12 -23.22
1  2014/11/21 16:05:00 19.56 -05.30
2  2014/01/31 13:55:00 02.00 31.10
3  2014/04/00 14:20:00 17.42 12.14
4  2014/07/25 15:30:00 35.25 05.90
5  2014/05/15 12:07:00 23.95 07.11
6  2014/07/29 17:34:00 44.00 17.43
7  2014/03/20 18:00:00 -11.12 -22.05
8  2014/09/21 12:00:00 06.44 41.55

我的问题是如何找到输出包含9行?

3 个答案:

答案 0 :(得分:1)

这不能回答您的具体问题

      if [[ $h>=11 ]]; then
          if [[ $h<=18 ]] && [[ $s<=00 ]]; then

所有的测试始终返回true

test[[[命令根据他们看到的参数数量采取不同的行动。 所有这些测试都有一个参数。在这种情况下,如果它是非空字符串,则表示您有成功的返回码。

在运营商周围设置空白至关重要。

      if [[ $h >= 11 ]]; then
          if [[ $h <= 18 ]] && [[ $s <= 00 ]]; then

问题:您对此测试的期望是什么? [[ $s <= 00 ]]

请注意,这些都是 lexical 比较。你可能想要这个:

      # if hour is between 11 and 18 inclusive
      if (( 10#$h >= 11 && 10#$h <= 18 )); then

答案 1 :(得分:0)

你已经用$ count知道了这个值。由于你从0开始计算,你想要的数字是$ count + 1.

答案 2 :(得分:0)

如果我在循环结束时添加命令“wc -l”,我可以得到我想要的,意味着行数(9行)。但是我想知道是否有办法将它完全放入循环中,也许使用相同的命令“wc -l”。

#!/bin/bash

  let count=0
  while read cdat ctim clat clon
       do
          h=${ctim:0:2};    # substring hours from ctim
          m=${ctim:3:2};
          s=${ctim:6:2};
           if [[ $h>=11 && $h<=17 ]] || [[ $ctim == "18:00:00" ]]; then
               echo "$count $LINE" $cdat $ctim $clat $clon  
               let count=$count+1         
           fi

       done  <  cloud.txt | wc -l 

出口

结果恰好是: 9

但现在如何在循环中做到这一点?