Zusammenführen von Spalten aus zwei separaten Dateien


10

Wie erstelle ich mit awk eine neue Datei, in der ausgewählte Spalten aus zwei separaten Dateien zusammengeführt werden? Ohne die Elementreihenfolge von BEIDEN Dateien durcheinander zu bringen.

Beispiel: Datei 3 kann Spalte 1,2,3 aus Datei 1 und Spalte 4 aus Datei 2 enthalten.

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

Antworten:


4

Versuche dies:

$ 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

Vielen Dank! Ich habe diesen Ausweg auch erfolgreich mit gawk pr -m -t -s\ File1.txt File2.txt | gawk '{print $1,$2,$3, $6}' > File3.txt
ausprobiert

2
@Dovah: Sie können paste file1 file2ausgewählte Felder verwenden und dann ausdrucken awk.
Cuonglm

Dies speichert file2im Speicher, was bei großen Dateien unzulässig sein kann. Es gibt einen einfacheren Weg, dies ohne den Speicheraufwand zu tun (siehe meine Antwort).
Gilles 'SO - hör auf böse zu sein'

16

Dafür gibt es ein spezielles Tool : paste. Es verkettet jede vollständige Zeile aus der ersten Datei mit der entsprechenden Zeile aus der zweiten Datei. Sie können unerwünschte Spalten vorher oder nachher entfernen. Angenommen, Ihre Spalten sind durch Tabulatoren getrennt:

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

Hier ist eine Möglichkeit, beide Dateien vorzufiltern, die auf der Substitution von ksh / bash / zsh-Prozessen beruhen.

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

Awk ist in erster Linie darauf ausgerichtet, jeweils eine Datei zu verarbeiten. Sie können jedoch auch aufrufen getline, um parallel aus einer anderen Datei zu lesen.

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

Bisher habe ich angenommen, dass Sie Zeile 1 von Datei 1 mit Zeile 1 von Datei 2, Zeile 2 von Datei 1 mit Zeile 2 von Datei 2 usw. abgleichen möchten. Wenn Sie den Inhalt einer Spalte abgleichen möchten, ist dies a ganz andere Sache. joinerledigt den Job, vorausgesetzt, die Spalte, mit der Sie übereinstimmen möchten, ist sortiert.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.