如何在两个文件中搜索重复的用户,然后打印这些行?

时间:2011-03-31 19:42:36

标签: for-loop awk grep

我有两个文件: FILE1 FILE2

FILE1:

user1        1.1.1.1
user2        2.2.2.2
user3        3.14.14.3
user4        4.4.4.4
user5        198.222.222.222

FILE2:

user1        99.22.54.214
user66       45.22.88.88
user99       44.55.66.66
user4        8.8.8.8
user39       54.54.54.54
user2        2.2.2.2

输出文件:

user1        1.1.1.1
user1        99.22.54.214
user2        2.2.2.2
user4        4.4.4.4
user4        8.8.8.8

我尝试了for循环,但取得了特别的成功。 任何人都可以给我写一个代码吗? THX!

5 个答案:

答案 0 :(得分:0)

查看unix命令uniq

http://unixhelp.ed.ac.uk/CGI/man-cgi?uniq

假设文件中有空格字符而不是标签 这样的事情可能会起作用

cat file1 file2 |排序| uniq -D -w6 | uniq> file3

抱歉,纠正了上述错误......

答案 1 :(得分:0)

while read user ip ; do match=`grep -E "$user " file2 2>/dev/null` ; if [ $? -eq 0 ] ; then echo $user $ip ; echo $match ; fi ; done < file1
user1 1.1.1.1
user1 99.22.54.214
user2 2.2.2.2
user2 2.2.2.2
user4 4.4.4.4
user4 8.8.8.8

答案 2 :(得分:0)

fgrep -h -f <(cut -d ' ' -f 1 FILE1 FILE2 | sort | uniq -d) FILE1 FILE2 | sort -k1

从两个文件中删除第一个字段,然后搜索重复项,然后在两个文件中搜索相关行。但你也可以用AWK在几个方面做到这一点......例如像是这样的事情:

awk '{if ( users[$1] = "" ) { users[$1]=$2 ; printed[$1]=0} else { if (printed[$1]==0) {print $1 users[$1] ; printed[$1]=1 ; print $0 } else { print $0 } }' | sort

当它第一次看到用户时,保存该行,然后在下一次(次)看到同一个用户时,检查是否已经打印了第一次出现,如果没有,则打印出第一次出现,然后是实际打印。如果第一次出现,则仅打印实际行。

HTH

答案 3 :(得分:0)

$ awk 'FNR==NR{a[$1]=$0;next}($1 in a){print $0;print a[$1]} ' file2 file1 | uniq
user1        1.1.1.1
user1        99.22.54.214
user2        2.2.2.2
user4        4.4.4.4
user4        8.8.8.8

答案 4 :(得分:0)

这是我的尝试,它保留了一行内的空格。首先,创建一个名为showdup.awk的脚本:

# showdup.awk
$1 != lastkey {
    # Flush out the last set: only print out if the last set contains
    # more than one lines
    if (count > 1) {
        for (i = 0; i < count; i++) {
            print savedLine[i]
        }
    }

    # Reset the count
    count = 0
}

{
    savedLine[count++] = $0;
    lastkey = $1;
}

接下来,调用showdup.awk:

cat file1 file2|sort|awk -f showdup.awk