python - separador - in awk
Cómo verificar si una lista de cadenas está presente en dos archivos separados (9)
¿Su entrada realmente tiene un signo de dólar al comienzo de cada línea, o es una peculiaridad de formato de su pregunta? Si puede deshacerse de los signos de dólar, puede usar esto:
fgrep -v -f fileb filea
Tengo dos archivos, "Archivo A" es una lista de direcciones IP con direcciones MAC correspondientes en la misma línea. "Archivo B" es una lista de solo direcciones MAC. Necesito comparar los dos archivos y enumerar las líneas del archivo A que no tienen direcciones MAC encontradas en el archivo B.
PRESENTAR UN:
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
ARCHIVO B:
AA:BB:CC:DD:EE:01
AA:BB:CC:DD:EE:02
Entonces la salida debería ser:
172.0.0.3 AA:BB:CC:DD:EE:03
Estoy buscando soluciones en sed, awk, grep, python o realmente cualquier cosa que me dé el archivo que quiero.
Esto podría funcionar para usted (GUN sed);
sed ''s|.*|/&/Id|'' fileb | sed -f - filea
Pitón:
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
EDIT : OK para que todos publiquen la misma respuesta de python. Alcanzo primero a Python pero me sorprendo con esto:
awk ''NR == FNR {fileb[$1];next} !($2 in fileb)'' fileb filea
EDIT2 : OP eliminó los $ principales de las líneas, por lo que python y awk cambian y fgrep sale a jugar.
fgrep -v -f fileb filea
Podría crear un ejemplo de Java que puedas traducir al idioma que quieras
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;
}
}
Redirigir esta salida a un archivo le dará su resultado.
Con el siguiente archivo de entrada de
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
Resultado:
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
Python es más fácil. Lea el archivo B en un diccionario, luego vaya al archivo A y busque una coincidencia en el diccionario.
Una forma de usar awk
. Guarda los MAC de fileB
en una matriz y para cada segundo campo de fileA
comprueba en la matriz y solo imprime cuando no se encuentra.
awk ''
FNR == NR {
data[ $0 ] = 1;
next;
}
NFR < NR && !($2 in data)
'' fileB fileA
Salida:
172.0.0.3 AA:BB:CC:DD:EE:03
#!/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))
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))
salida:
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
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())