使用unixshell进行重复数据分析
我只想打印或显示文件之间的重复数据。假设我有3个文件,它们的数据如下:使用unixshell进行重复数据分析,shell,unix,Shell,Unix,我只想打印或显示文件之间的重复数据。假设我有3个文件,它们的数据如下: file 1: man file 2: man file 3: female 我想使用任何shell脚本或awk命令或任何unixshell命令打印,以仅显示文件中的重复数据。例如,“man”一词在文件中是重复的,因此我只希望在屏幕上打印man。当我以任何顺序(如123、231或132)进行分析时,屏幕上只应打印重复的数据。Testdata: sort | uniq -c | awk '$1 > 1' $ grep
file 1: man
file 2: man
file 3: female
我想使用任何shell脚本或awk命令或任何unixshell命令打印,以仅显示文件中的重复数据。例如,“man”一词在文件中是重复的,因此我只希望在屏幕上打印man。当我以任何顺序(如123、231或132)进行分析时,屏幕上只应打印重复的数据。Testdata:
sort | uniq -c | awk '$1 > 1'
$ grep . file*
file1:man
file2:man
file3:female
file4:duplicate
file4:duplicate
打印所有重复行
1.使用sort
+uniq
2.使用awk
仅打印两个或多个文件共享的重复行
1.使用GNU awk 4+
提示:-awk'FNR==NR{a[$1]+;b[$2]+;next}a[$1]| | b[$1]{print$1}a[$2]| | b[$2]{print$2}'3 2 1(但这不是在我从3开始时打印重复数据),(当我从1或2开始时,它正在打印重复数据。不,这不是我想要的。这是打印所有文件中的所有数据。发布我的答案后,我意识到你的问题有点含糊不清,你只想打印多个文件中共享的重复数据,还是应该打印同一文件中的重复行?你知道吗还没有回答我的问题,但我添加了另一个解决方案,该解决方案只打印至少两个文件共享的重复行。这也会打印计数,从而扭曲输出,这可能对OP来说是个问题,也可能不是问题。
uniq
附带-d
,因此确实没有理由这样做,但可以这样做只需使用awk
即可完成整个过程。
$ cat file* | sort | uniq -d
duplicate
man
$ awk '{a[$0]++} END{for (i in a) if (a[i] > 1) print i}' file*
duplicate
man
$ cat t.awk
#!/usr/bin/awk -f
BEGINFILE { delete a }
{ a[$0]++ }
ENDFILE { for (i in a) b[i]++ }
END { for (i in b) if (b[i] > 1) print i }
$ ./t.awk file*
man