Ich möchte zwei Dateien vergleichen und abgleichen und sie in einer Datei ausdrucken

Ich möchte zwei Dateien vergleichen und abgleichen und sie in einer Datei ausdrucken

Ich habe zwei Dateien, Datei1 und Datei2

Datei1:

r11_abc_gkhsa 1.0 1.5 1.9
r11_bcd_gkhsa 1.0 1.5 1.7
r11_acd_gkhsa 1.3 1.6 1.5
r11_xyz_gkhsa 1.0 1.5 1.9

Datei2:

sd1_bcd_gkhsa 1.8 1.5 1.9
ab1_abc_gkhsa 1.6 1.4 1.5
sfs_xyz_gkhsa 1.4 1.6 1.4
sd1_acd_gkhsa 1.2 1.3 1.5
sfs_ryb_gkhsa 1.5 1.2 1.7

Ich möchte „abc, bcd, acd und xyz“ aus Datei1 mit Datei2 abgleichen. Immer wenn es mit Datei2 übereinstimmt, möchte ich es folgendermaßen ausdrucken.

Ausgabe:

r11_abc_gkhsa 1.0 1.5 1.9     ab1_abc_gkhsa 1.6 1.4 1.5
r11_bcd_gkhsa 1.0 1.5 1.7     sd1_bcd_gkhsa 1.8 1.5 1.9
r11_acd_gkhsa 1.3 1.6 1.5     sd1_acd_gkhsa 1.2 1.3 1.5
r11_xyz_gkhsa 1.0 1.5 1.9     sfs_xyz_gkhsa 1.4 1.6 1.4
sfs_ryb_gkhsa 1.5 1.2 1.7

kann Perl oder sed verwenden. Kann mir jemand Ideen geben, wie ich daran arbeiten kann?

Antwort1

Wenn Sie nur einfache Arrays verwenden möchten bash-

#read in the data from 2 files
unset arr1; declare -A arr1; 
while read -r -u3 line; do \
    i=${line%_*}; \
    i=${i#*_}; \
    arr1[$i]+=" $line"; \
done 3< <(cat f1 f2); \
exec 3<&-
#output array by iterating throug the keys
for k in "${!arr1[@]}"; do \
     echo ${arr1[$k]}; \
done | sort

Ausgabe --

r11_abc_gkhsa 1.0 1.5 1.9 ab1_abc_gkhsa 1.6 1.4 1.5
r11_acd_gkhsa 1.3 1.6 1.5 sd1_acd_gkhsa 1.2 1.3 1.5
r11_bcd_gkhsa 1.0 1.5 1.7 sd1_bcd_gkhsa 1.8 1.5 1.9
r11_xyz_gkhsa 1.0 1.5 1.9 sfs_xyz_gkhsa 1.4 1.6 1.4
sfs_ryb_gkhsa 1.5 1.2 1.7

Antwort2

Verwenden von join, sort, und sed:

join -j 2 -t_ -a 1 -a 2  -o 1.1,1.2,1.3,1.9999,2.1,2.2,2.3 \
     <(sort -t_ -k2 file1) <(sort -t_ -k2 file2) | \
     sed 's/__/  /g;s/^ *//g' | sort
  1. sort Datei1undDatei2verwenden Sie bashdie *Prozesssubstitution, dann …
  2. Verwenden Sie _als Feldtrennzeichen joindie beiden sortierten Dateien mit gemeinsamen Instanzen von Feld Nr. 2 und drucken Sie auch jede Zeile aus einer der Dateien einzeln aus, die nicht übereinstimmt. Das nicht vorhandene Feld 1.9999trennt jedes verbundene Paar mit einem zusätzlichen, _um Schritt Nr. 3 zu vereinfachen.
  3. Bereinigen Sie hässliche Ausgabeteile mit sed.
  4. sortdie Ergebnisse.

Ausgabe:

r11_abc_gkhsa 1.0 1.5 1.9  ab1_abc_gkhsa 1.6 1.4 1.5
r11_acd_gkhsa 1.3 1.6 1.5  sd1_acd_gkhsa 1.2 1.3 1.5
r11_bcd_gkhsa 1.0 1.5 1.7  sd1_bcd_gkhsa 1.8 1.5 1.9
r11_xyz_gkhsa 1.0 1.5 1.9  sfs_xyz_gkhsa 1.4 1.6 1.4
sfs_ryb_gkhsa 1.5 1.2 1.7

verwandte Informationen