Awk pour fusionner deux fichiers en utilisant hash

1

J'ai deux fichiers de même longueur et je veux échanger un fichier sur 3 colonnes avec le contenu d'un autre fichier. Je veux imprimer ce qui suit:

f1Col1 f1Col2 f1Col3 f1Col4 f1Col5 f1Col6 f2Col1 f2Col2 f2Col3 f1Col10 f1Col11 f1Col12

f1Col1est la première colonne de file1, etc.

J'ai essayé d'utiliser les éléments suivants:

awk 'NR==FNR {h1[$1] = $1; h2[$2] = $2; h3[$3] = $3; next} {print $1,$2,$3,$4,$5,$6,h1[$1],h2[$2],h3[$3],$10,$11,$12}' file2 file1

qui imprime toutes les colonnes nécessaires file1mais imprime des blancs au lieu des colonnes file2. Quel est le problème ici?

(note: j'utilise OS X Yosemite)

nitrate de sodium
la source
Voulez-vous utiliser uniquement awk, ou d'autres commandes sont-elles autorisées?
Vincent
J'étais curieux de savoir pourquoi cela ne fonctionnait pas.
nitrate de sodium

Réponses:

1

Si file2contient (par exemple)

The    quick    brown
fox    jumps    over
the    lazy     dog.

alors la première partie de votre awkscript est mise

h1["The"]="The"
h2["quick"]="quick"
h3["brown"]="brown"
h1["fox"]="fox"
h2["jumps"]="jumps"
h3["over"]="over"
h1["the"]="the"
h2["lazy"]="lazy"
h3["dog."]="dog."

Cela ne vous est d'aucune utilité lorsque vous essayez d'utiliser ces valeurs enregistrées dans la deuxième partie du script. vous devez indexer les tableaux par numéro de ligne:

h1[1]="The"
h2[1]="quick"
h3[1]="brown"
h1[2]="fox"
h2[2]="jumps"
h3[2]="over"
h1[3]="the"
h2[3]="lazy"
h3[3]="dog."

Donc, votre script doit être

awk 'NR==FNR {h1[FNR] = $1; h2[FNR] = $2; h3[FNR] = $3; next}
{print $1,$2,$3,$4,$5,$6,h1[FNR],h2[FNR],h3[FNR],$10,$11,$12}' file2 file1
Scott
la source
1

Qu'en est-il de:

paste <(awk'{ print $1,$2,$3,$4,$5,$6 }' file1) <(awk '{ print $1,$2,$3 }' file2) <(awk '{ print $10,$11,$12 }' file1) 
  • coller prend les entrées des commandes awk individuelles
  • en plaçant les commandes awk entre '<()', seule la sortie standard est lue
  • coller fusionne les trois fichiers de sortie ligne par ligne
Vincent
la source
1
Nous recherchons des réponses substantielles fournissant des explications et un contexte. Ne vous contentez pas de donner une réponse d'une ligne. Explique pourquoi ta réponse est juste. Les réponses qui n'incluent pas d'explications peuvent être supprimées.
G-Man
2
Pourriez-vous modifier votre réponse afin d'expliquer pourquoi ce code répond à la question?
DavidPostill