bash - ¿Cómo puedo buscar en file1.txt y file2.txt caracteres coincidentes e imprimir la salida en un nuevo archivo?

CorePress2024-01-25  17

¡Me encontré con un problema! Simplemente no tengo suficiente conocimiento para resolver esto por mi cuenta, así que si alguien puede ayudarme, se lo agradecería.

Tengo dos archivos de texto: file1.txt y file2.txt; Tienen un formato similar pero no exacto. Los nombres están en números de línea separados y los archivos tienen diferentes recuentos de líneas. Hacer esto manualmente no sería viable debido a la cantidad de datos en los archivos.

Ejemplo de formatos de archivo:

archivo1.txt

NAME:FLAT
Jerome:Flat 6
Jimmy:Flat 4

archivo2.txt

0:NAME:JOB:MONEY:FLAT
1:Bob:Developer:0:Flat 7
2:Jerome:Gardener::Flat 6
3:Cindy:Graphics:0:Flat 5
4:Jimmy:Mod:0:Flat 4

Estoy intentando buscar en el archivo1.txt para ver qué NOMBRE coincide con el NOMBRE del archivo2 e imprimir la línea completa del archivo2.txt en un nuevo documento de texto.

Aquí hay un ejemplo de lo que me gustaría hacer:

Checks matching NAME in file1.txt and file2.txt
Ignores "1:Bob:Developer:0:Flat 7" because Bob only exists in file2.txt
Pastes "2:Jerome:Gardener::Flat 6" into file3.txt because Jerome exists in file1.txt and file2.txt
Ignores "3:Cindy:Graphics:0:Flat 5" because Cindy only exists in file2.txt
Pastes "4:Jimmy:Mod:0:Flat 4" into file3.txt because Jimmy exists in file1.txt and file2.txt

Cómo se vería el archivo 3 Archivo3.txt

2:Jerome:Gardener::Flat 6
4:Jimmy:Mod:0:Flat 4

¡Gracias por leer! Si alguienPodría informarme si esto es posible, sería genial.

EDITAR: Lo que tengo hasta ahora

awk -F ":" 'FNR==NR{a[];next}( in a){print}' file2.txt file1.txt > file3.txt

3

use -F: como separador de campos, también deberá marcar $2 en a y el orden de los archivos debe ser archivo1 archivo2... consulte backreference.org/2010/02/10/idiomatic-awk para explicaciones

- Profundidad del sol

28/03/2021 a las 15:01

Encontré una solución alternativa que funcionará por ahora. Gracias por tu ayuda. ¡No es exactamente lo que necesito pero servirá por ahora! No lo publicaré aquí porque no es realmente relevante :)

- Jcmnia

28/03/2021 a las 15:38



------------------------------------

Con las muestras mostradas, ¿podría intentar seguirlas? Escrito y probado con GNU awk.

awk '
BEGIN  { FS=":" }
FNR==1 { next   }
FNR==NR{
  arr[]
  next
}
( in arr)
' file1.txt file2.txt

Explicación: Añadiendo una explicación detallada de lo anterior.

awk '                    ##Starting awk program from here.
BEGIN  { FS=":" }        ##Starting BEGIN section from here and setting FS as : here.
FNR==1 { next   }        ##Checking if this is first line in any of Input_file then simply go to next line.
FNR==NR{                 ##This condition will be TRUE when file1.txt is being read.
  arr[]                ##Creating array with  as key here.
  next                   ##next will skip all further statements from here.
}
( in arr)              ##Checking condition if 2nd fueld is in arr then print line from file2.txt
' file1.txt file2.txt    ##Mentioning Input_file names here.



------------------------------------

Con algunas herramientas GNU:

join -t ":" -1 1 -2 2 <(sed 1d File1.txt | sort) <(sort -t ":" -k 2,2 File2.txt) -o 2.1,2.2,2.3,2.4,2.5

Salida:


2:Jerome:Gardener::Flat 6
4:Jimmy:Mod:0:Flat 4

Ver: unión de información y ordenación manual

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare