web-dev-qa-db-fra.com

Rechercher la sortie de AWK dans un autre fichier

J'ai deux fichiers fichierA et fichierB.

Je dois extraire column1 de fileA comme awk '{print $1}', puis la sortie sera recherchée dans un autre fichierB et enregistrera les enregistrements correspondants dans un nouveau fichier fileC en termes simples, tels que:

fileA:

seg1     rec1
seg2     rec2
seg3     rec3 

J'ai besoin de récupérer la colonne 1 en utilisant la commande awk et cette colonne 1 est recherchée dans fileB pour récupérer les enregistrements tels que:

fileB:

seg1     one
seg2     two
seg3     three
seg4     four
seg5     five

A partir du fichier A, les données de la colonne 1 sont extraites et utilisées dans la recherche dans le fichier B, l'enregistrement correspondant est enregistré dans un fichier de test. Ma sortie devrait être comme ça:

fileC:

seg1       one
seg2       two
seg3       three
4
ASAD

Peut être obtenu facilement avec awk comme suit:

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

résultat,

seg1       one
seg2       two
seg3       three

en haut, nous lisons d'abord fileA et contient toute la colonne1 dans un tableau nommé inFileA, puis regardons dans fileB la première colonne et si elle correspond au fichier enregistré column1 de fileA va ensuite imprimer la ligne entière de fileB.

7
αғsнιη

Si les colonnes à comparer sont triées, vous pouvez utiliser join:

join -o 2.1,2.2 file1 file2

join correspond aux colonnes triées des fichiers d'entrée et les imprime. -o 2,1,2.2 limite la sortie aux première et deuxième colonnes du deuxième fichier d'entrée.

4
muru

Vous pouvez utiliser le one-liner suivant:

cut -f1 fileA | grep -f - fileB > fileC
  • la commande cut extraira la première colonne de fileA (en supposant la séparation des tabulations. utilisez -d pour spécifier autre chose)
  • la commande grep prend la sortie de cut et recherche fileB pour toutes les chaînes.
  • la sortie sera écrite dans fileC
3
Wayne_Yux

Une tentative avec le script bash. (N'oubliez pas de rendre exécutable.)

fileA et fileB doivent exister dans le même dossier que le script.

Un script général qui fonctionne pour tous les fichiers décrits avec script et génère le fichier avec le texte correspondant sous la forme <fa>_<fb>_match.txt:

Pour utiliser cela, lancez ./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.
2
ankit7540

Vous avez déjà reçu d'excellentes réponses. Juste pour ajouter au mélange, voici une approche Perl:

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

Et une version golfée de réponse de KasiyA :

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

Et voici une solution un peu compliquée grep:

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