Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用unixshell进行重复数据分析_Shell_Unix - Fatal编程技术网

使用unixshell进行重复数据分析

使用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

我只想打印或显示文件之间的重复数据。假设我有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*
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