2

我有一个包含字符串列表的文件。我想按照它们首先出现在文件中的顺序提取唯一的字符串。

因此,例如,如果我的文件包含:

foo
bar
foo
bar
baz
bar
foo

我想输出:

foo
bar
baz

如果我只想要唯一值,我可以使用sort input|uniq,但这会按字母顺序对我的结果进行排序。

4

5 回答 5

12

awk 中很简单:

awk '!a[$0]++'
于 2012-10-27T21:41:58.253 回答
4

简单的 Perl 解决方案:

perl -ne 'print unless $seen{$_}++'

如果您的最后一行不包含换行符,您可能需要将其更改为

perl -nE 'chomp; say unless $seen{$_}++'
于 2012-10-27T21:23:04.460 回答
2

我认为尼克的目标是这样的:

sort test.txt | uniq | xargs -I{} grep -Fnxm1 {} test.txt | sort -k1n -t: | cut -f2 -d:

或者,也许我对他的建议读得太多了。不过,我认为awk答案要酷得多。

于 2012-10-28T04:06:33.200 回答
1

重击 4:

declare -A seen
while read line; do 
  if (( ! seen["$line"]++ )); then 
    echo "$line"
  fi
done <file.txt

对于 bash <= 3,我会使用其他具有关联数组的东西,例如 choroba 的 perl 解决方案或 awk:

awk '!seen[$0]++' file.txt
于 2012-10-27T21:33:46.080 回答
-1

我不太明白,但是是这样的:

sort test.txt | uniq | xargs -0 -I {} grep {} test.txt

也许有人可以修复?

于 2012-10-27T21:35:38.137 回答