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
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.
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.
Vous pouvez utiliser le one-liner suivant:
cut -f1 fileA | grep -f - fileB > fileC
cut
extraira la première colonne de fileA
(en supposant la séparation des tabulations. utilisez -d
pour spécifier autre chose)grep
prend la sortie de cut
et recherche fileB
pour toutes les chaînes.fileC
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.
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