【问题标题】:Count number of Special Character in Unix Shell计算 Unix Shell 中特殊字符的数量
【发布时间】:2017-12-06 15:55:04
【问题描述】:

我有一个由八进制 \036 或十六进制值 1e 分隔的分隔文件。

我需要使用 bash shell 脚本计算每行的分隔符数量。

我尝试使用 awk,不确定这是否是最好的方法。

样本输入(| 是 \036 的表示)

Example|Running|123|

预期输出:

3

【问题讨论】:

    标签: bash shell unix awk hex


    【解决方案1】:
    awk -F'|' '{print NF-1}' file
    

    | 更改为您喜欢的任何分隔符。如果您的文件可以有空行,那么您需要将其调整为:

    awk -F'|' '{print (NF ? NF-1 : 0)}' file
    

    【讨论】:

    • NF可以为0吗?我找不到任何明确的规范,但由于 FS 分隔 字段,您当然可以拥有一个没有 FS 的字段。唯一可能没有字段的行是空行,afaics,但这似乎被视为单个空字段而不是没有字段。
    • 是的,echo "" | awk '{print NF}' 输出 0,因为空行没有字段,因此字段数为零。如果该行仅包含空格并且您使用的是默认 FS(一个空白字符),情况也是如此,因为使用默认 FS 进行字段拆分会在将记录拆分为字段之前去除前导和尾随空白,并且显然没有任何剩余-删除前导/尾随空格后的空白行。
    【解决方案2】:

    你可以试试

    awk '{print gsub(/\|/,"")}'
    

    【讨论】:

      【解决方案3】:

      试一试

      awk -F"|" '{print substr($3,length($3))}' OFS="|"   Input_file
      

      解释: 将字段分隔符-F 设为|,然后根据您的需要通过$3 打印第三列。然后将OFS(输出字段分隔符)设置为|。最后在这里提到 Input_file 名称。

      【讨论】:

      • 我认为这只是打印第三列?另外,分隔符应该是 \036?
      • @Defcon,现在改了,请改 -F"|"到 -F"\036" 让我知道这是否对您有帮助?
      【解决方案4】:

      据我所知,这将起作用

      echo "Example|Running|123|" | tr -cd '|' | wc -c
      

      输出

      3

      【讨论】:

        【解决方案5】:

        这应该适合你:

        awk -F '\036' '{print NF-1}' file
        
        3
        

        -F '\036' 将输入字段分隔符设置为八进制值036

        【讨论】:

          【解决方案6】:

          Awk 可能不是最好的工具。 Gnu grep 有一个很酷的 -o 选项,可以在单独的行上打印每个匹配的模式。然后,您可以计算为每个输入行生成了多少匹配行,这就是您的分隔符的计数。例如。 (文件中的^^实际上是十六进制1e)

          $ cat -v i
          a^^b^^c
          d^^e^^f^^g
          
          $ grep -n -o $'\x1e' i | uniq -c
                2 1:
                3 2:
          

          如果你删除 uniq -c 你可以看到它是如何工作的。因为第一行有两个匹配的模式,所以您将打印两次“1”。或者尝试使用一些常规的 ascii 字符,这样会更清楚 -o 和 -n 选项的作用。

          如果你想打印行号,然后是该行的字段计数,我会这样做:

          $grep -n -o $'\x1e' i | tr -d ':' | uniq -c | awk '{print $2 " " $1}'
          1 2
          2 3
          

          这假定文件中的每一行都至少包含一个分隔符。如果不是这样,这里还有另一种可能更快的方法:

          $ tr -d -c $'\x1e\n' < i | awk '{print length}'
          2
          3
          0
          0
          0
          

          这使用 tr 删除 (-d) 所有不是 (-c) 1e 或 \n 的字符。然后,它将该数据流通过管道传输到 awk,它只计算每行剩余的字符数。如果你想要行号,在末尾添加“| cat -n”。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-09-05
            • 1970-01-01
            • 2020-03-15
            • 1970-01-01
            • 1970-01-01
            • 2021-01-11
            相关资源
            最近更新 更多