Объединить два csv + первый файл первый столбец + второй файл первый столбец и взять только данные совпадающих столбцов [закрыто]

-1
24.05.2018, 18:05
2 ответа

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 greppara 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.txtdevolverá 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
0
28.01.2020, 05:10

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 .
  • -ogenerar solo campos especificados; 0es la unión (primer campo )(se puede reemplazar con 1.1o2.1); el formato esX.Y(qué campo Yde qué archivo X.)

  • tail -n +2 infiledevuelve 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; NRse 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; FNRse 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==FNRserá verdadero solo cuando awk esté leyendo el primer archivo de entrada file1y se ejecutará su siguiente bloque. que está creando una matriz asociada llamada seencon las líneas en file1 como índices de esa matriz si no se configuró previamente.

  • $1 in seen:se ejecuta solo en el segundo file2y verifica si la primera columna en ese archivo coincide con alguna clave en la matriz seeny luego se imprimirá.

1
28.01.2020, 05:10

Теги

Похожие вопросы