1
votes

bash ajouter le contenu de deux fichiers correspondant à un index

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?


0 commentaires

4 Réponses :


0
votes

L'inverse:

awk 'FNR==NR{b[$1]=$0;next} {print $0,b[$1]}' b a


0 commentaires

2
votes

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.


4 commentaires

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.



1
votes

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


0 commentaires

1
votes

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  


0 commentaires