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

For loop 如何在两个文件中搜索重复用户,然后打印这些行?,for-loop,awk,grep,For Loop,Awk,Grep,我有两个文件:FILE1和FILE2 文件1: 文件2: 输出文件: 我尝试了一个for循环,但特别成功。。 有人能给我写一个代码吗? 谢谢 看看unix命令uniq 假定文件中有空格字符而不是制表符 像这样的东西可能有用 cat file1 file2 | sort | uniq-D-w6 | uniq>file3 对不起,更正了上面的错误 while read user ip ; do match=`grep -E "$user " file2 2>/dev/null` ; if [

我有两个文件:FILE1和FILE2

文件1: 文件2: 输出文件: 我尝试了一个for循环,但特别成功。。 有人能给我写一个代码吗?
谢谢

看看unix命令uniq

假定文件中有空格字符而不是制表符 像这样的东西可能有用

cat file1 file2 | sort | uniq-D-w6 | uniq>file3

对不起,更正了上面的错误

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
当它第一次看到用户时,保存该行,然后在下次看到同一用户时,检查第一次出现的内容是否已经打印,如果没有,则打印第一次出现的内容,然后再打印实际发生的内容。如果打印第一次出现,则仅打印实际行


HTH

这是我的尝试,它保留了一行中的空格。首先,创建一个名为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;
}
cat file1 file2|sort|awk -f showdup.awk

事实上,正如我所看到的,它需要a-d。这个解决方案不起作用。。它只是将第一个和第二个文件连接到第三个文件!是的,我应该先尝试一下,上面的解决方案是有效的:可以向fgrep添加-h,并添加一个最终的| sort-k1以符合预期;干净利落,干净利落。我注意到uniq命令没有任何作用:即使没有它,也能得到正确的输出。Thx..这个解决方案工作得很好
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
fgrep -h -f <(cut -d ' ' -f 1 FILE1 FILE2 | sort | uniq -d) FILE1 FILE2 | sort -k1
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
$ 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
# 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;
}
cat file1 file2|sort|awk -f showdup.awk