J'ai deux fichiers, fichier1
b b c c zzz uuu d d qqq lll a a xxx ggg f f b b g g e e rrr ppp
et fichier2
awk 'FNR==NR{a[$1]=$0;next} ($1 in a) {print a[$1],$0}' a b
Je voudrais ajouter le contenu du fichier2 au fichier1 si il y a une correspondance du nombre, cependant, j'aimerais également imprimer les lignes non correspondantes de file1 sans modifier l'ordre. L'effet souhaité est donc
a a xxx ggg b b c c zzz uuu d d qqq lll e e rrr ppp f f g g h h i i j j
La colonne correspondante peut être répétée aussi, ce n'est pas un problème, donc ça pourrait aussi être
a xxx ggg b c zzz uuu d qqq lll e rrr ppp f g h i j
J'ai essayé
b c zzz uuu d qqq lll a xxx ggg f b g e rrr ppp
mais le résultat est
a b c d e f g h i j
donc la commande est perdue et il manque des lignes de file1, une suggestion?
4 Réponses :
L'inverse:
awk 'FNR==NR{b[$1]=$0;next} {print $0,b[$1]}' b a
Pourriez-vous s'il vous plaît essayer de suivre.
awk 'FNR == NR {val = $ 1; $ 1 = ""; sub (/ ^ + /, ""); a [val] = $ 0; suivant} {print $ 0, a [$ 1] } 'Input_file2 Input_file1
Explication:
Vérification de la condition ici FNR == NR
ce qui signifie que lorsque la valeur si FNR est égale à NR, procédez comme suit. Cette condition sera vraie lors de la lecture du 1er Inpit_file2.
Maintenant, vous créez une variable nommée val
dont la valeur est le premier champ, puis annulez le premier champ et remplacez l'espace initial par NULL.
Maintenant, vous créez un tableau nommé a dont l'index est la variable val et la valeur est la ligne courante.
L'utilisation de next
sautera toutes les autres instructions à partir d'ici.
Maintenant, imprimez le premier champ, puis imprimez une valeur [$ 1] dans le cas où cette valeur n'est PAS présente, il le laissera vide.
Je vois que votre réponse est exactement la même que la sortie souhaitée de l'OP alors que mon résultat contient des espaces supplémentaires :)
Oui, en ai pris soin mon pote. Bravo et merci.
Grande explication ++
@anunhava, merci monsieur pour vos encouragements monsieur.
Veuillez essayer:
a xxx ggg b c zzz uuu d qqq lll e rrr ppp f g h i j
Résultat:
awk 'FNR==NR{a=$1;$1="";b[a]=$0;next} {print $1, b[$1]}' file2 file1
En supposant que le vrai fichier1 est trié comme votre exemple est:
$ join -j1 -o 0,2.2,2.3 -a1 file1.txt <(sort -u file2.txt) a xxx ggg b c zzz uuu d qqq lll e rrr ppp f g h i j