sromero separador scripts mayor filtrar contador python text sed awk compare

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())