【发布时间】:2016-04-30 10:15:18
【问题描述】:
我想在 bash 中编写一个脚本,打印出标准输入中重复最少的行
我写了这段代码:
#!/bin/bash
var=1000
while read line
do
tmp=$(grep -c $line)
if [ $tmp -lt $var ]
then
var=$tmp
out=$line
fi
done
var="$var $out"
echo $var
但是例如当使用这样的测试时
id1
id2
id3
id1
square
id1
id2
id3
id1
circle
id2
id2
程序只进入循环一次,因此输出错误
3 id1
什么时候应该是正确的
1 square
这一行
tmp=$(grep -c $line)
似乎打破了循环,但我不知道为什么。 有什么方法可以绕过在我的代码中使用 grep 或任何其他方法来修复我的脚本?
【问题讨论】:
-
为什么
circle是您的预期输出?在您的示例中,它既不是最后一个重复行,也不是最后一个唯一行。 -
它应该是最少重复的,而不是最后一次重复;)不过,您在下面的回答对我帮助很大;)
-
那么你的意思是第一个唯一的行吗?您有多个独特的线路;它们都是最少重复的。
-
不,我想我的英语技能没有让我说得足够清楚,如果标准输入中有唯一的一行,它也应该打印出来,假设我们有一行包含单词: square ,两行包含 word: circle 和三行包含 word: triangle 。它应该打印“正方形”,因为它只在文件中出现一次(出现次数最少)
-
这很清楚,但如果每个都有三个,你只想要第一个吗?