【问题标题】:Unix Bash script: Using sort -n for a group of variablesUnix Bash 脚本:对一组变量使用 sort -n
【发布时间】:2017-07-10 01:51:03
【问题描述】:

我在这个网站上找到了很多关于 sort 命令的帮助,但是我在弄清楚如何将它与变量一起使用时遇到了麻烦。基本上,我有两个(或更多)变量,我想按升序回显结果。

!#usr/bin/bash
# Look for PNG files
pngTotal=0
for i in /home/*
do
j=`grep -q PNG $i`
if [ $? == 0 ]; then
#echo "add 1 to png"
((pngTotal++))
fi
done
echo "PNG: $pngTotal"

# Look for GIF files
gifTotal=0
for i in /home/*
do
j=`grep -q GIF $i`
if [ $? == 0 ]; then
#echo "add 1 to gif"
((gifTotal++))
fi
done
echo "GIF: $gifTotal"

我想按升序列出我的 pngTotal、gifTotal 等的变量。我尝试了 sort -n $pngTotal $gifTotal 的不同语法,但没有成功。

【问题讨论】:

  • 你的shebang其实是个bangshe
  • 样本输入,需要样本输出。
  • ummmm ...你到底想在你的脚本中做什么?我了解您似乎拥有的文件可能没有正确的扩展名或您不信任该文件,因此您想查看该文件是否为 png,但您可以使用 grep 中包含字母 PNG 的文本文件但显然这不会是一个 png 文件。查看 file 命令,特别是 -b 和 --mime-type 选项。我还要提一下,如果您使用的是 grep,您实际上可以将其直接传递给 'if' 命令
  • @grail 用于学习目的。如果您有点愚蠢地注意到这是一个初学者问题。

标签: bash sorting unix


【解决方案1】:
  • 你似乎试图解决的实际问题可以用一个单行来解决,它会计算你home中的所有图像文件,而不仅仅是GIF和PNG:

    find /home/ -type f -print0 \
      | xargs -0L10 file -b --mime-type \
      | fgrep image/  \
      | cut -d/ -f2 \
      | sort | uniq -c | sort -k1,1n
    

    它是这样工作的:收集所有文件名 (find),让 xargs 将它们传递给 file 以找到它们的 mime 类型,用 fgrep 过滤掉非图像,删除字符串 @ 987654327@通过cut,用sort|uniq -c计算每种类型有多少个,最后对结果进行数字排序。

  • 对一段代码的输出进行排序的一般问题可以用一个子shell来解决:

    #!/bin/bash
    ( 
      # Any command you like...
      echo "PNG: 3829"
      # Other commands
      echo "GIF: 233"
    ) | sort -k2,2n
    

【讨论】:

    【解决方案2】:

    这有点hacky,但如果您不介意将结果写入临时文件,您可以执行以下操作:

    #!/usr/bin/env bash
    # Look for PNG files
    pngTotal=0
    for i in /home/*
    do
    j=`grep -q PNG $i`
    if [ $? == 0 ]; then
    #echo "add 1 to png"
    ((pngTotal++))
    fi
    done
    echo "PNG: $pngTotal" >> /tmp/total.log
    
    # Look for GIF files
    gifTotal=0
    for i in /home/*
    do
    j=`grep -q GIF $i`
    if [ $? == 0 ]; then
    #echo "add 1 to gif"
    ((gifTotal++))
    fi
    done
    echo "GIF: $gifTotal" >> /tmp/total.log
    
    sort -k2 -n /tmp/total.log
    rm /tmp/total.log
    

    你基本上将结果输出到一个文件,然后根据第二列排序(默认分隔符是空格),然后根据数值升序排序。

    【讨论】:

    • 这是一个完美的解决方案。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2013-06-16
    • 2021-11-04
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 2015-10-01
    相关资源
    最近更新 更多