在字段中查找重复项并在unix bash中打印它们

t28*_*292 5 unix bash awk

我有一个包含的文件

apple
apple
banana
orange
apple
orange
Run Code Online (Sandbox Code Playgroud)

我想要一个脚本,找到重复的苹果和橙色,并告诉用户以下内容:苹果和橙色重复.我试过了

nawk '!x[$1]++' FS="," filename
Run Code Online (Sandbox Code Playgroud)

找到重复的项目,以便如何在unix bash中打印出来?

dev*_*ull 10

要打印重复的行,您可以说:

$ sort filename | uniq -d
apple
orange
Run Code Online (Sandbox Code Playgroud)

如果您还要打印计数,请提供以下-c选项uniq:

$ sort filename | uniq -dc
      3 apple
      2 orange
Run Code Online (Sandbox Code Playgroud)


hek*_*mgl 1

更新:

问题已发生重大变化。以前,在回答这个问题时,输入文件应如下所示:

apple apple banana orange apple orange
banana orange apple
...
Run Code Online (Sandbox Code Playgroud)

然而,该解决方案无论如何都会起作用,但对于这个特殊用例来说可能有点太复杂了。


以下 awk 脚本将完成这项工作:

awk '{i=1;while(i <= NF){a[$(i++)]++}}END{for(i in a){if(a[i]>1){print i,a[i]}}}' your.file
Run Code Online (Sandbox Code Playgroud)

输出:

apple 3
orange 2
Run Code Online (Sandbox Code Playgroud)

用这样的形式更容易理解:

#!/usr/bin/awk

{
  i=1;
  # iterate through every field
  while(i <= NF) {
    a[$(i++)]++; # count occurrences of every field
  }
}

# after all input lines have been read ...
END {
  for(i in a) {
    # ... print those fields which occurred more than 1 time
    if(a[i] > 1) {
      print i,a[i];
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

然后使该文件可执行并执行它,并将输入文件名传递给它:

chmod +x script.awk
./script.awk your.file  
Run Code Online (Sandbox Code Playgroud)