【问题标题】:Bash loop command until file contains n duplicate entries (lines)Bash 循环命令直到文件包含 n 个重复条目(行)
【发布时间】:2011-01-29 06:45:52
【问题描述】:

我正在编写一个脚本,我需要创建一个循环来执行相同的命令,直到文件包含指定数量的重复条目。例如,对于每个循环,我都会将随机字符串回显到文件results。当有 10 行相同的字符串时,我希望循环停止。

我想到了类似的东西

while [ `这里有一些命令(可能使用 uniq)` -lt 10 ]

命令1
命令2
命令3
完成

您知道如何解决这个问题吗?无法使用 grep,因为我不知道需要查找什么字符串。

感谢您的建议。

【问题讨论】:

    标签: bash duplicates


    【解决方案1】:

    我会在 awk 或 Bash 4 中使用关联数组,并避免运行两次排序以及 uniq 和 head。

    每当您将值写入文件时,递增该数组元素。

    #!/bin/bash
    # Bash 4
    while true
    do
        one_command
        val=$(command_to_output_val | tee out_file)
        if ((array[$val]++ >= 10))
        then
            break
        fi
    done
    

    【讨论】:

      【解决方案2】:

      这是另一个版本,您可以在一个 (g)awk 进程中执行此操作。也尽量使用$()语法

      while [ "$(gawk '{!_[$0]++}END{b=asort(_,a);print a[b]}' file)" -lt 10 ]
      

      【讨论】:

        【解决方案3】:

        不是最有效的解决方案,但这应该可行:

        while [ `sort $file | uniq -c | awk '{print $1}' | sort -nr | head -n1` -lt 10 ]
        

        【讨论】:

          【解决方案4】:
          while [ `sort filename | uniq -c | sort -nr | head -1 | sed -e 's:^ *::' -e 's: .*::'` -lt 10 ]
          

          效率不高(“sort -nr | head -1”位特别次优),但这是标准的“快速而肮脏”的解决方案。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-05-26
            • 2023-04-04
            • 1970-01-01
            • 1970-01-01
            • 2018-08-19
            • 2014-07-31
            • 2019-08-04
            • 1970-01-01
            相关资源
            最近更新 更多