Fusion de colonnes à partir de deux fichiers distincts

10

Comment créer un nouveau fichier fusionnant des colonnes sélectives à partir de deux fichiers distincts en utilisant awk? Sans gâcher l'ordre des éléments des deux fichiers.

Exemple: le fichier 3 peut contenir la colonne 1,2,3 du fichier 1 et la colonne 4 du fichier 2.

File 1
A   23  8   T
A   63  9   9
B   45  3   J

File 2
A   0
A   6   
B   5

File 3
A   23  8   0
A   63  9   6
B   45  3   5
dovah
la source

Réponses:

4

Essaye ça:

$ awk 'FNR==NR{a[FNR]=$2;next};{$NF=a[FNR]};1' file2 file1
A 23 8 0
A 63 9 6
B 45 3 5
cuonglm
la source
Merci! J'ai également essayé avec succès cette sortie en utilisant gawk:pr -m -t -s\ File1.txt File2.txt | gawk '{print $1,$2,$3, $6}' > File3.txt
dovah
2
@Dovah: vous pouvez utiliser paste file1 file2puis imprimer les champs sélectionnés dans awk.
cuonglm
Cela stocke file2en mémoire, ce qui peut être prohibitif si les fichiers sont volumineux. Il existe un moyen plus simple de le faire sans surcharge de mémoire (voir ma réponse).
Gilles 'SO- arrête d'être méchant'
17

Il y a un outil dédié pour cela: paste. Il concatène chaque ligne complète du premier fichier avec la ligne correspondante du deuxième fichier; vous pouvez supprimer les colonnes indésirables avant ou après. Par exemple, en supposant que vos colonnes sont délimitées par des tabulations:

paste file1.txt file2.txt | cut -f 1,2,3,6

Voici un moyen de pré-filtrer les deux fichiers qui repose sur la substitution de processus ksh / bash / zsh.

paste <(<file1.txt sed 's/[[:space:]][[:space:]]*[^[:space:]]*$//') \
      <(<file1.txt sed 's/^[^[:space:]]*[[:space:]][[:space:]]*//')

Awk est principalement conçu pour traiter un fichier à la fois, mais vous pouvez appeler getlinepour lire un autre fichier en parallèle.

awk '
  BEGIN {file2=ARGV[2]; ARGV[2]="";}
  {$0 = $0 ORS getline(); print $1, $2, $3, $6;}
' file1.txt file2.txt

Jusqu'à présent, je suppose que vous voulez faire correspondre la ligne 1 du fichier 1 avec la ligne 1 du fichier 2, la ligne 2 du fichier 1 avec la ligne 2 du fichier 2, etc. Si vous voulez faire correspondre le contenu d'une colonne, c'est un matière complètement différente. joinfera le travail à condition que la colonne que vous souhaitez faire correspondre soit triée.

Gilles 'SO- arrête d'être méchant'
la source