4 votos

Resultados de la búsqueda de AWK en otro archivo

Tengo dos archivos utilizado y msib.

Tengo que extraer column1 desde utilizado como awk '{print $1}' y, a continuación, la salida será buscado en otros msib y guardar los registros coincidentes en un nuevo archivo fileC en palabras simples como:

fileA:

seg1     rec1
seg2     rec2
seg3     rec3 

Quiero recuperar la columna 1 utilizando el comando awk y esta columna 1 se busca en fileB para recuperar los registros como:

fileB:

seg1     one
seg2     two
seg3     three
seg4     four
seg5     five

Desde utilizado, column1 se extraen los datos y y estos datos son utilizados para la búsqueda en msib y pareados de registro se guarda en un archivo de prueba. Mi salida debe ser similar a esto:

fileC:

seg1       one
seg2       two
seg3       three

8voto

KasiyA Puntos 10471

Se puede lograr fácilmente con awk como sigue:

awk 'NR==FNR{inFileA[$1]; next} ($1 in inFileA)' fileA fileB > write_to_fileC

resultado,

seg1       one
seg2       two
seg3       three

en la anterior, primero estamos leyendo el utilizado y ocupa toda la column1 desde dentro de una matriz llamada inFileA, a continuación, busque en msib para su primera columna y si es coincidente con la guarda column1 desde utilizado a continuación se va a imprimir toda la fila de msib.

5voto

Stewart Puntos 1385

Usted ya ha recibido algunas respuestas excelentes. Solo para agregar a la mezcla, he aquí un Perl enfoque:

$ perl -ane '$i ? $k{$F[0]} && print : { $k{$F[0]}++ }; $i++ if eof' fileA fileB
seg1     one
seg2     two
seg3     three

Y un golfed versión de KasiyA la respuesta:

$ awk 'NR==FNR ? a[$1] : $1 in a' fileA fileB 
seg1     one
seg2     two
seg3     three

Y aquí está un poco enrevesado grep solución:

$ grep -Ff <(grep -oP '^\S+' fileA) fileB
seg1     one
seg2     two
seg3     three

4voto

muru Puntos 43315

Si las columnas que se comparan son ordenados, puede utilizar join:

join -o 2.1,2.2 file1 file2

join coincide con columnas ordenadas de los archivos de entrada y los imprime. -o 2,1,2.2 restringe la salida a la primera y segunda columnas de la segunda archivo de entrada.

3voto

Wayne_Yux Puntos 887

Puede utilizar la siguiente línea:

cut -f1 fileA | grep -f - fileB > fileC
  • el cut comando extraer la primera columna de fileA (suponiendo ficha de separación. uso -d a especificar algo más)
  • el grep comando toma la salida de la cut y búsquedas fileB de todas las cadenas.
  • la salida se escribe en fileC

2voto

ankit7540 Puntos 445

Un intento con un script de bash. (Recuerda que para hacer ejecutable.)

fileA y fileB que debe de existir en la misma carpeta que el script.

Un general de la secuencia de comandos que va a trabajar para cualquiera de los dos archivos descritos con guión y generar el archivo con el texto que coincida como <fa>_<fb>_match.txt:

Para ello, ejecute ./script_name.sh fileA fileB

#!/bin/bash
fa="$1"  # first file- which has  columns
fb="$2"  # second file - which has  raw data to be searched
# file with name <fa>_<fb>_match.txt will be generated.

myarr=($(awk 'NR>1 {print $1}' "$fa")) # NR makes awk to ignore first row.

for index in ${!myarr[@]}; do
    #echo $index/${#myarr[@]}
    #echo    "${myarr[index]}"
text="${myarr[index]}"
grep -w -F "$text" $fb  >>  $fa"_"$fb"_match".txt
done

# file with name <fa>_<fb>_match.txt will be generated.

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: