Bash:比较for循环中的每一行

时间:2016-11-12 21:24:23

标签: bash shell

我有一个shell脚本需要分析文件中的数据,如下所示:

255  48  48             exp1
97  97  97              exas
238  44  44             dkopkw
194 194 194             sdkaok

然后我获取数据并在for语句中对其进行排序。对于每一行,我需要比较数据并查看它是否小于 90 并在数字之间打印一条线。

  #!/bin/bash

  for line in "$(sort /myfile.txt -k1 -n)"
  do

    COL_ONE=$(print "line" | awk '{print $1}')

    if [[ $COL_ONE -lt 90 ]]; then
            echo "$line"
            echo "------------------"
    else 
            echo "$line"
    fi

done

然而,当它运行时,打印数字之间的线。我希望我的输出看起来如下:

97  97  97              exas
------------------------------
194 194 194             sdkaok
238  44  44             dkopkw
255  48  48             exp1

我不确定我做错了什么,这让我感到疯狂。

1 个答案:

答案 0 :(得分:0)

解决您尝试的问题并且更加强大和高效的解决方案:

sort -k1,1 -n myfile.txt | awk '$1 < 98 { print $0 "\n------------------"; next } 1'

请注意,我已使用98而非90作为比较值,以与您所需的输出保持一致。
另请注意,1添加到-k1以确保排序真正限于第1个字段。

至于你尝试过的事情:

将效率问题,9890问题以及不明智的做法放在一边:

  • 如果双引号命令替换("$(...)"),则其输出将被视为for输入循环。

  • print不是Bash命令(也不可能是外部实用程序的名称,"line"应该是"$line"才能引用变量。