Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash循环命令,直到文件包含n个重复条目(行)_Bash_Duplicates - Fatal编程技术网

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

Bash循环命令,直到文件包含n个重复条目(行),bash,duplicates,Bash,Duplicates,我正在编写一个脚本,需要创建一个循环来执行相同的命令,直到文件包含指定数量的重复条目。例如,对于每个循环,我都会将随机字符串回送到文件结果。当有10行相同的字符串时,我希望循环停止 我想到了类似的事情 而[`some command here(可能使用uniq)`-lt 10] 做 命令1 命令2 命令3 完成 你知道如何解决这个问题吗?无法使用grep,因为我不知道需要查找什么字符串 谢谢你的建议 while [ `sort filename | uniq -c | sort -nr | he

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

我想到了类似的事情

而[`some command here(可能使用uniq)`-lt 10]

命令1
命令2
命令3
完成

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

谢谢你的建议

while [ `sort filename | uniq -c | sort -nr | head -1 | sed -e 's:^ *::' -e 's: .*::'` -lt 10 ]
效率不高(“sort-nr | head-1”位特别次优),但这是标准的“快速脏”解决方案


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

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

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

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

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

这里是另一个版本,您可以在一个(g)awk进程中完成它。同时尽量使用
$()
语法

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

这里是另一个版本,您可以在一个(g)awk进程中完成它。同时尽量使用
$()
语法

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

我会在awk或Bash4中使用关联数组,并避免运行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

我会在awk或Bash4中使用关联数组,并避免运行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