如何检查两个单独文件中是否存在字符串列表

时间:2012-07-10 17:13:42

标签: python text sed awk compare

我有两个文件,“文件A”是在同一行上具有相应MAC地址的IP地址列表。 “文件B”是仅MAC地址的列表。我需要比较这两个文件,并列出文件A中没有文件B中找到的MAC地址的行。

文件A:

172.0.0.1 AA:BB:CC:DD:EE:01
172.0.0.2 AA:BB:CC:DD:EE:02
172.0.0.3 AA:BB:CC:DD:EE:03

文件B:

AA:BB:CC:DD:EE:01
AA:BB:CC:DD:EE:02

所以输出应该是:

172.0.0.3 AA:BB:CC:DD:EE:03

我正在寻找sed,awk,grep,python中的解决方案或任何能够提供我想要的文件的解决方案。

9 个答案:

答案 0 :(得分:4)

你的输入在每一行的开头是否真的有一个美元符号,或者是你问题的格式化怪癖?如果你可以摆脱美元符号,那么你可以使用这个:

fgrep -v -f fileb filea

答案 1 :(得分:1)

#!/usr/bin/env python
with open('fileb') as fileb, open('filea') as filea:
    macs = set(map(str.strip, fileb))
    for line in filea:
        ip_mac = line.split()
        if len(ip_mac) == 2 and ip_mac[1] not in macs:
           print(" ".join(ip_mac))

答案 2 :(得分:1)

with open('filea','r') as fa:    
    with open('fileb','r') as f:
        MACS=set(line.strip() for line in f)

    for line in fa:
        IP,MAC=line.split()
        if MAC not in MACS:
            print (line.strip())

答案 3 :(得分:1)

with open(FILEB) as file1,open(FILEA) as file2:
file1={mac.strip() for mac in file1}
file2={line.split()[1]:line.split()[0] for line in file2}
    for x in file2:
        if x not in file1:
            print("{0} {1}".format(file2[x],x))

输出

172.0.0.2 AA:BB:CC:DD:EE:05
172.0.0.4 AA:BB:CC:DD:EE:06
172.0.0.6 AA:BB:CC:DD:EE:03
172.0.0.66 AA:BB:CC:DD:EE:0E

答案 4 :(得分:1)

使用awk的一种方法。它将fileB中的MAC保存在一个数组中,并且fileA的每个第二个字段在数组中检查它,并且只在未找到时打印。

awk '
    FNR == NR {
        data[ $0 ] = 1;
        next;
    }
    NFR < NR && !($2 in data)
' fileB fileA

输出:

172.0.0.3 AA:BB:CC:DD:EE:03

答案 5 :(得分:1)

的Python:

macs = set(line.strip() for line in open('fileb'))
with open('filea') as ips:
    for line in ips:
        ip,mac = line.split()
        if mac not in macs:
            print line

编辑:好的,所以每个人都发布了相同的python答案。我也是第一次到达python但是 gawk

awk 'NR == FNR {fileb[$1];next} !($2 in fileb)' fileb filea

EDIT2 :OP删除了行中的前导$,这样python和awk就会改变,fgrep会出现。

fgrep -v -f fileb filea

答案 6 :(得分:0)

Python最简单。将文件B读入字典,然后浏览文件A并在字典中查找匹配项。

答案 7 :(得分:0)

我可以创建一个Java示例,您可以将其转换为您想要的任何语言

import java.io.*;
import java.util.*;
class Macs {
    public static void main(String...args)throws Exception {
        Set<String> macs = loadLines("macs.txt");
        Set<String> ips = loadLines("ips.txt");

        for(String raw : ips) {
            String[] tokens = raw.split("\\s"); // by space
            String ip = tokens[0];
            String mac = tokens[1];
            if(!macs.contains(mac))
                System.out.println(raw);
        } 
    }

    static Set<String> loadLines(String filename) throws Exception {
        Scanner sc = new Scanner(new File(filename));
        Set<String> lines = new HashSet<String>();
        while(sc.hasNextLine()) {
            // substring(1) removes leading $
            lines.add(sc.nextLine().substring(1).toLowerCase());
        }
        return lines;
    }
}

将此输出重定向到文件将为您提供结果。

使用以下

输入文件

macs.txt

$AA:BB:CC:DD:EE:01
$AA:BB:CC:DD:EE:02
$AA:BB:CF:DD:EE:09
$AA:EE:CF:DD:EE:09

ips.txt

$172.0.0.1 AA:BB:CC:DD:EE:01
$172.0.0.2 AA:BB:CC:DD:EE:02
$172.0.0.2 AA:BB:CC:DD:EE:05
$172.0.0.66 AA:BB:CC:DD:EE:0E
$172.0.0.4 AA:BB:CC:DD:EE:06
$172.0.0.5 AA:BB:CF:DD:EE:09
$172.0.0.6 AA:BB:CC:DD:EE:03

结果:

c:\files\j>java Macs
172.0.0.6 aa:bb:cc:dd:ee:03
172.0.0.66 aa:bb:cc:dd:ee:0e
172.0.0.2 aa:bb:cc:dd:ee:05
172.0.0.4 aa:bb:cc:dd:ee:06

答案 8 :(得分:0)

这可能对你有用(GUN sed);

sed 's|.*|/&/Id|' fileb | sed -f - filea