查找 CSV 中重复的列值

查找 CSV 中重复的列值

我试图从一个大的 csv 文件中查找重复的 id,每行只有记录,但查找重复的条件是第一列。<id>,<value>,<date>

示例.csv

11111111,high,6/3/2019
22222222,high,6/3/2019
33333333,high,6/3/2019
11111111,low,5/3/2019
11111111,medium,7/3/2019

期望的输出:

11111111,high,6/3/2019
11111111,low,5/3/2019
11111111,medium,7/3/2019

输出不需要顺序。

答案1

使用 AWK:

awk -F, 'data[$1] && !output[$1] { print data[$1]; output[$1] = 1 }; output[$1]; { data[$1] = $0 }'

它会查看每一行,其行为如下:

  • 如果我们已经看到第一列中的值,请注意,我们应该输出与该值匹配的任何行,并输出记忆的行;
  • 如果当前行的第一列与我们想要输出的匹配,则输出当前行;
  • 存储在第一列上键入的当前行。

答案2

如果所有 ID 的长度相同(示例中为 8 个字符),则可以使用sortGNU完成整个操作uniq

$ sort file | uniq -Dw 8
11111111,high,6/3/2019
11111111,low,5/3/2019
11111111,medium,7/3/2019

如果它们的长度不同,您仍然可以使用此方法,但它会变得有点复杂:

$ tr ',' ' ' < file | sort  | rev | uniq -f2 -D | rev | tr ' ' ','
11111111,high,6/3/2019
11111111,low,5/3/2019
11111111,medium,7/3/2019

答案3

awk -F, '$1 in m { print m[$1]$0; m[$1]=""; next } 
                 { m[$1]=$0 "\n" }' ex

答案4

GNU sed这可以通过利用其扩展的正则表达式构造来完成。我们首先将文件加载到模式空间中,然后从模式空间的开头删除所有不重复的行。此外,一个标志\n\n,被放置在模式空间的末尾,我们在其中覆盖重复的行。因此,一旦该标志冒泡到模式空间的开头 => 操作就结束了,我们现在可以继续从模式空间中删除标记并打印到标准输出。

$ sed -Ee '
   $!{
      N;s/^/\n/
      $s/$/\n\n/;D
   }
   /^([^,\n]*),[^\n]*\n(.*\n)?\1,/!D
   s/^([^\n]*)(.*)/\2\1\n/;/^\n\n/!D
   s/^\n\n//;s/\n$//
' inp

这是POSIX-sed解决问题的一个版本和另一种方法,即我们不在模式或保留空间中的任何时间点维护整个文件。一旦看到重复行,就会将其打印到标准输出,并且参考行被标记并打印,标记是因为我们不想在下次看到重复行时打印它。

$ sed -ne '
   H;g;y/\n_/_\n/
   /.*_\([^,_]*\)\(,[^_]*\)\[0]_\(.*_\)\{0,1\}\1,[^_]*$/{
      s//\1\2/;y/_\n/\n_/;p
      g;s/.*\n//p;g;y/\n_/_\n/
      s/\(.*_\([^,_]*\),[^_]*\)\[0]\(_\(.*_\)\{0,1\}\)\2,[^_]*$/\1[1]\3/
      s/_$//;y/_\n/\n_/;bh
   }
   /.*_\([^,_]*\)\(,[^_]*\)\[1]_\(.*_\)\{0,1\}\1,[^_]*$/{
      s/.*_//;y/_\n/\n_/;p
      g;s/\(.*\)\n.*/\1/;bh
   }
   y/_\n/\n_/;s/$/[0]/;:h;h
' inp

这是解决Perl我们在数组散列中维护行的问题的基础解决方案。一旦我们看到重复的行,我们就会打印数组并清空它,并打印重复的行。

$ perl -F, -lane '
   push(@{$h{$F[0]}},$_),next if ! exists $h{$F[0]};
   print for splice(@{$h{$F[0]}}),$_;
' inp

输出:

11111111,high,6/3/2019
11111111,low,5/3/2019
11111111,medium,7/3/2019

相关内容