在for循环bash中循环两个值

时间:2017-09-19 05:34:35

标签: linux bash shell

下面是我的输入文件,我需要传递并找出其值大于10G。

100G tom
30G kelly
40G messy
50G Kyrie
1G james
.5G curry
2.4 sweety
57G muller
6G kevin

以下是bash中的代码尝试。

for i in `cat test.txt`;
do
  k=$(echo $i | awk '{print $1}' | grep G | cut -d'G' -f1;);
  j=$(echo $i | grep -v '^[0-9]';);
  int=${k%.*};
  if [[ -z $int ]];
    then continue
  else
    if [ $int -ge 10 ];
    then
      # du -sh
      echo $j
      # sudo du -sh $j
    fi
  fi
# echo $int
done

如果超过10,即if [ $int -ge 10 ]正在发挥作用,它就会产生结果。如果值大于10Gig,我无法打印名称。简单来说,我的预期结果是

100G tom
30G kelly
40G messy
50G Kyrie
57G muller

5 个答案:

答案 0 :(得分:3)

awk 'BEGIN{FS="G| "} $1>10' inputfile
100G tom
30G kelly
40G messy
50G Kyrie
57G muller

这是使用G作为字段分隔符,$1>10是打印整个记录的条件。一段时间空间也用作字段分隔符来处理像2.4 sweety

这样的记录

注意:这假定您的输入仅在Gigs中有记录。

答案 1 :(得分:2)

使用numfmt工具( GNU Coreutils 的一部分):

while read -r line
do
    n=$(numfmt --from=auto --format %f "${line%% *}")
    (( $(bc <<< "$n > 10000000000") )) && printf '%s\n' "$line"
done < test.txt

循环逐行读取test.txt个文件; -r选项可防止解释反斜杠。由于IFS变量未被修改,line被修剪,我们可以安全地提取第一列,其中包含"${line%% *}"这样的表达式,它会删除第一个空格以及它之后的所有内容第一栏。

numfmt命令将第一列转换为浮点格式。

由于Bash不支持浮点数,bc用于检查$n是否大于10000000000.如果是,则命令以零状态退出(表示成功),{调用{1}}命令。

显然,您可以将上述代码与其他常用单位一起使用,例如printfKKiM等。

由于实际文件的大小以整数表示,因此您可以摆脱&#34;浮点运算&#34;通过以下方式:

Mi

零精度格式declare -i n=$(numfmt --from=auto --format %.0f "${line%% *}") (( $n > 10000000000 )) && printf '%s\n' "$line" 表示%.0f将结果返回为(舍入)整数。第二行使用arithmetic expansion检查numfmt是否大于10000000000。

Mac OS 上,$n工具由GNU Coreutils包提供;可执行文件的名称是numfmt

答案 2 :(得分:1)

您可以将grep用作:

egrep '^0*[1-9][0-9]+\.?[0-9]*G' file_name

答案 3 :(得分:1)

Don't read lines with for.阅读包含两个字段的行的惯用方法是

while read -r first second; do
    : ... things
done <test.txt

但当然,你可以简单地做到

awk '($1 ~ /G$/ && $1+0>10) || $1 ~ /[TP]$/' test.txt

(我添加了太字节和数PB只是为了告诉你如果你需要的话它是如何完成的。)

通常,在shell中逐个循环遍历文件中的行是反模式,建议您尝试使用sed或Awk,除非确实需要循环体是shell脚本。

答案 4 :(得分:0)

你可以试试这个:

bash-4.4 $ cat filename
100G汤姆 30G Kely
40G凌乱
50G kyrie
1G james
.5G咖喱
2.4甜心
57G研磨机
6G凯文

bash-4.4 $ cat script.sh
cat filename | grep&#34; G&#34;&gt; tempFile
读取线;

大小= echo $line|awk 'BEGIN{FS="G"}{print $1}'
检查= echo $line|grep "^[0-9]"|wc -l
如果[$ check -ne 0]
然后
如果[$ size -gt 10]
然后
echo $ line
科幻
科幻
DONE

bash-4.4 $ ./script.sh
100G汤姆 30G Kely
40G凌乱
50G kyrie
57G muller

如果不再需要,可以删除脚本末尾的临时文件。或者每次运行脚本时都会被覆盖。

希望这会有所帮助。