Bash循环命令,直到文件包含n个重复条目(行)

时间:2010-03-19 00:46:53

标签: bash duplicates

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

我想到了像

这样的东西
  

虽然[`这里有一些命令(也许是使用uniq)`-lt 10]        做
  命令1
  命令2
  指令代码
  完成

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

感谢您的建议。

4 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

我会在awk或Bash 4中使用关联数组,并避免运行sort两次加上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

答案 3 :(得分:0)

while [ `sort filename | uniq -c | sort -nr | head -1 | sed -e 's:^ *::' -e 's: .*::'` -lt 10 ]

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