Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.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
Shell 如何在unix中从3个不同的文件中查找匹配的记录_Shell_Unix_Sed_Awk - Fatal编程技术网

Shell 如何在unix中从3个不同的文件中查找匹配的记录

Shell 如何在unix中从3个不同的文件中查找匹配的记录,shell,unix,sed,awk,Shell,Unix,Sed,Awk,我有3个不同的文件。 Test1.txt、Test2.txt和Test3.txt Test1.txt包含 Test2.txt包含 Test3.txt包含 我只希望在这3个文件中看到匹配的记录 因此,上面示例中的匹配记录将JJTP@yahoo.com 输出应该是 JJTP@yahoo.com 如果每个文件中没有重复的行,则: $ awk '++a[$1]==3' test[1-3] JJTP@yahoo.com 要查找两个文件中的公用行,可以使用: sort Test1.txt Test2

我有3个不同的文件。 Test1.txt、Test2.txt和Test3.txt

Test1.txt包含

Test2.txt包含

Test3.txt包含

我只希望在这3个文件中看到匹配的记录

因此,上面示例中的匹配记录将JJTP@yahoo.com 输出应该是

JJTP@yahoo.com

如果每个文件中没有重复的行,则:

$ awk '++a[$1]==3' test[1-3]
JJTP@yahoo.com

要查找两个文件中的公用行,可以使用:

  sort Test1.txt Test2.txt | uniq -d
或者,如果希望保留Test1.txt中的顺序,可以使用:

  while read x; do grep -w "$x" Test2.txt; done < Test1.txt 
或:

排序方法假定文件本身没有重复的行;如果是这样,您可能需要创建临时文件

如果您希望使用sed而不是grep,请尝试使用sed-n/^$x$/p.

comm列出两个文件的公用行。只需在前两个文件中找到公共行,然后将输出再次传输到comm,并找到与第三个文件的公共行

comm -12 <(sort Test1.txt) <(sort Test2.txt) | comm -12 - <(sort Test3.txt)
以下是您如何使用awk:

输出: 这是一个混合了jaypal和sudo__o解决方案的awk。 它不会给出假阳性,因为它可以测试行的唯一性

awk '!a[$1 FS FILENAME]++ && ++b[$1]==3' test*
JJTP@yahoo.com
如果您有未知数量的文件,这可能是一个选项

awk '!a[$1 FS FILENAME]++ && ++b[$1]==ARGC-1' test*

ARGC存储awk+1读取的文件数,如果一行在一个文件中重复三次,可能会出现误报。非常聪明的做法是,竖起大拇指。如果3个文件名不同,并非所有文件都是test1/2/3,在这种情况下,我将如何实现这一点?
  sort Test1.txt Test2.txt | uniq -d | sort - Test3.txt | uniq -d
  cat                           Test1.txt       |\
  while read x; do grep -w "$x" Test2.txt; done |\
  while read x; do grep -w "$x" Test3.txt; done
comm -12 <(sort Test1.txt) <(sort Test2.txt) | comm -12 - <(sort Test3.txt)
awk '
FILENAME == ARGV[1] { a[$0]++ }
FILENAME == ARGV[2] && ($0 in a) { b[$0]++ }
FILENAME == ARGV[3] && ($0 in b)' file1 file2 file3
JJTP@yahoo.com
awk '!a[$1 FS FILENAME]++ && ++b[$1]==3' test*
JJTP@yahoo.com
awk '!a[$1 FS FILENAME]++ && ++b[$1]==ARGC-1' test*