【问题标题】:How to get information from file with condition in Shell script without using "awk" [closed]如何在不使用“awk”的情况下从 Shell 脚本中的条件文件中获取信息 [关闭]
【发布时间】:2020-09-13 09:48:22
【问题描述】:

我有文件

10 -     William English 80 100 404
10 abc   William Math    50 100 501
10 xyzsd William IT      60 100 550
10 -     William Sec     60 100 401
11 -     John    English 90 100 400
11 -     John    Math    75 100 404
11 ali   John    IT      85 100 550 
11 -     John    Sec     60 100 401

条件:如果第二列是 - 然后第二个条件检查以 4 开头的最后一列值,然后计算名称(William 和 John) 输出:

3 John
2 William

【问题讨论】:

    标签: linux bash shell unix sh


    【解决方案1】:

    试试:

    awk -F ' ' '{if ($2 == "-" && $NF ~ /^4/) print $3}' <file_name> | uniq -c
    

    说明: 我们在 awk 中使用 if 语句来检查这两个条件:

    • 如果第二个元素等于'-'
    • 如果最后一个元素以 4 开头

    如果以上两个条件为真,我们正在打印名称,存储在第三个元素中

    uniq -c 将计算名称的出现次数

    【讨论】:

    • 如果我们想把 "$NF" 改成 element Like $7 {if ($2 == "-" && $7== ~ /^4/) print $3}
    • 不用加'==',把NF改成7就好了,比如:{if ($2 == "-" && $7 ~ /^4/) print $3}
    • 请您给我解释一下 ~ /^4/ ,它们是如何工作的以及为什么我们不需要 ==
    • 当然,/^4/ 是一个正则表达式,它表示任何以“4”开头的东西,'^' 用于字符串的开头。 '~' 表示'匹配',就像'like' 运算符。因此,表达式会将 $7 的值与 /^4/ 匹配,即检查 $7 是否以 4 开头。在这里,我们没有使用==,因为我们只是匹配$7的第一个字符,如果你想匹配$7的整个值,那么可以使用==,比如如果你想检查$7是否是400,那么它可以像这样使用:{if ($2 == "-" && $7 == "400") print $3}
    • 如果没有“awk”,我们怎么能做到这一点,还有其他方法吗?
    【解决方案2】:

    你可以使用这个awk:

    awk '$2 == "-" && $NF ~ /^4/ { ++freq[$3] }
    END { for (i in freq) print freq[i], i }' file
    
    2 William
    3 John
    

    【讨论】:

      猜你喜欢
      • 2020-12-30
      • 2012-10-24
      • 2011-04-28
      • 1970-01-01
      • 2012-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多