2010-03-19 62 views
0

我在寫腳本,我需要創建一個循環,它將執行相同的命令,直到文件包含指定數量的重複條目。例如,在每個循環中,我會將隨機字符串回顯到文件results。當有10行相同的字符串時,我想循環停止。Bash循環命令,直到文件包含n個重複條目(行)

我想到了什麼樣

而[`這裏的一些命令(可能使用的uniq)`-lt 10]

命令1
命令2
命令3

你有什麼想法如何解決這個問題?使用grep無法完成,因爲我不知道需要查找哪個字符串。

謝謝您的建議。

回答

1

不是最有效的解決方案,但這應該工作:

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

謝謝!完美無瑕地工作。 – Gargauth 2010-03-19 02:21:52

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

效率不高(「sort -nr | head -1」位特別次優),但這是標準的「快速和骯髒」解決方案。

1

這裏的另一個版本,你做一個(G)的awk進程中。也可以嘗試使用$()語法儘可能

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

我會用關聯數組在AWK或擊4,避免運行兩次排序uniq的加和頭部。

無論何時將值寫入文件,都會增加該數組元素。

#!/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