【问题标题】:print 1st string of a line if last 5 strings match input如果最后 5 个字符串与输入匹配,则打印一行的第一个字符串
【发布时间】:2017-03-02 09:20:46
【问题描述】:

如果最后 5 个字符串与特定输入匹配,我需要打印一行的第一个字符串。

示例:指定输入为2

India;1;2;3;4;5;6
Japan;1;2;2;2;2;2
China;2;2;2;2
England;2;2;2;2;2

预期输出:

Japan
England

如您所见,China 被排除在外,因为它不符合要求(最后 5 位数字必须与输入匹配)。

【问题讨论】:

  • 你尝试过什么,它是如何失败的?这应该可以在第一次调出 Awk 手册的几分钟内完成。

标签: bash awk ksh gawk


【解决方案1】:
grep ';2;2;2;2;2$' file | cut -d';' -f1
  • 正则表达式中的$ 代表“行尾”,因此 grep 将打印以给定字符串结尾的所有行
  • -d';' 告诉 cut 用分号分隔列
  • -f1 输出第一列

【讨论】:

    【解决方案2】:

    你可以使用awk:

    awk -F';' -v v="2" -v count=5 '
       {
         c=0;
         for(i=2;i<=NF;i++){
            if($i == v) c++ 
            if(c>=count){print $1;next}
         }
       }' file
    

    在哪里

    • v 是要匹配的值
    • count 是打印所需字符串的最大值数
    • for 循环正在解析以; 分隔的所有字段以找到匹配项

    此脚本不需要 5 个值 2 是连续的。

    【讨论】:

      【解决方案3】:

      使用 sed:

      sed -n 's/^\([^;]*\).*;2;2;2;2;2$/\1/p' file
      

      它捕获并输出以;2;2;2;2;2结尾的行中非;的第一个字符

      使用 GNU sed 可以将其缩短为:

      sed -nE 's/^([^;]*).*(;2){5}$/\1/p' file
      

      【讨论】:

        【解决方案4】:
        awk -F\; '/;2;2;2;2;2$/{print $1}' file
        Japan
        England
        

        【讨论】:

        • 虽然欢迎使用此代码 sn-p,并且可能会提供一些帮助,但它会是 greatly improved if it included an explanation of howwhy 这解决了问题。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人!请edit您的答案添加解释,并说明适用的限制和假设。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多