我有3个不同的文件。 Test1.txt,Test2.txt& Test3.txt
Test1.txt 包含
JJTP@yahoo.com
BBMU@ssc.com
HK@glb.com
Test2.txt 包含
SFTY@gmail.com
JJTP@yahoo.com
Test3.txt 包含
JJTP@yahoo.com
HK@glb.com
我想在这3个文件中只看到匹配的记录。
所以上面例子中的匹配记录将是JJTP@yahoo.com 输出应为
JJTP@yahoo.com
答案 0 :(得分:3)
如果您在每个文件中没有重复的行,那么:
$ awk '++a[$1]==3' test[1-3]
JJTP@yahoo.com
答案 1 :(得分:3)
这是一个awk
混合了jaypal和sudo_o解决方案
它不会给出误报,因为它会测试线条的唯一性。
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
答案 2 :(得分:1)
comm
列出了两个文件的公共行。只需找到前两个文件中的公共行,然后再次将输出传递给comm
,并找到第三个文件的公共行。
comm -12 <(sort Test1.txt) <(sort Test2.txt) | comm -12 - <(sort Test3.txt)
答案 3 :(得分:0)
要查找两个文件中的公共行,您可以使用:
sort Test1.txt Test2.txt | uniq -d
或者,如果您希望保留在Test1.txt中找到的订单,您可以使用:
while read x; do grep -w "$x" Test2.txt; done < Test1.txt
对于三个文件,请重复此步骤:
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
sort
方法假设文件本身没有重复的行;如果是这样,您可能需要创建临时文件。
如果您希望使用sed
而不是grep
,请尝试sed -n "/^$x$/p"
。
答案 4 :(得分:0)
以下是您对awk
:
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