Esto funcionará:
grep --color=never -f <(cut -d, -f1 file1.txt | sed 's#.*#^\0,#') file2.txt
Explicación:
grep -f
:Obtener patrones de ARCHIVO, uno por línea --color=never
(opcional )elimina el color de la salida grep
para las coincidencias. <([...])
es la sintaxis para crear un descriptor de archivo basado en el contenido entre corchetes que es el siguiente:cut -d, -f1 file1.txt
devolverá la primera columna de file1.txt sed 's#.*#^\0,#'
hará que la primera columna se lea como ^column1,
para crear el patrón correcto para grep
. si desea excluir los encabezados para evitar errores (que no son necesarios en su ejemplo ), use esto:
head -n 1 file2.txt && \
grep --color=never -f <(tail -n +2 file1.txt | cut -d, -f1 | sed 's#.*#^\0,#') file2.txt
Ambos comandos devuelven:
name,addr,id
abc,hj,1
pqr,hj.2
usojoin
:
join -t, -o 0,1.2,1.3 <(sort <(tail -n +2 file2)) <(sort <(tail -n +2 file1))
abc,hj,1
pqr,hj,2
-t,
especifique el separador de campos de entrada/salida como coma . -o
generar solo campos especificados; 0
es la unión (primer campo )(se puede reemplazar con 1.1
o2.1
); el formato esX.Y
(qué campo Y
de qué archivo X
.)
tail -n +2 infile
devuelve todas las líneas excepto la primera encabezado línea.
sort...
ordena cada archivo de entrada. O conawk
:
awk -F, 'NR==FNR {!seen[$1]; next} $1 in seen' file1 file2
name,addr,id
abc,hj,1
pqr,hj,2
-F,
especifique que el separador de campos de entrada es una coma . NR==FNR
; NR
se establecerá en 1 en el primer registro/línea leído por awk y se incrementará hasta que todos los registros/líneas se lean, ya sea si se trata de un solo archivo de entrada o de varios archivos; FNR
se establecerá en 1 en el primer registro/línea leído por awk y se incrementará hasta que todos los registros/líneas se lean en el archivo de entrada actual y se restablecerá a 1 para el siguiente archivo; entonces NR==FNR
será verdadero solo cuando awk esté leyendo el primer archivo de entrada file1
y se ejecutará su siguiente bloque. que está creando una matriz asociada llamada seen
con las líneas en file1 como índices de esa matriz si no se configuró previamente.
$1 in seen
:se ejecuta solo en el segundo file2
y verifica si la primera columna en ese archivo coincide con alguna clave en la matriz seen
y luego se imprimirá.