Vergleichen und Anhängen von Dateien basierend auf Feldern

Vergleichen und Anhängen von Dateien basierend auf Feldern

Ich möchte zwei Dateien vergleichen. Locus_file.txt ist eine sehr große Datei und atrr.txt ist eine kleine Datei. Ich möchte die ersten beiden Spalten der ersten Datei mit der zweiten Spalte von atrr.txt abgleichen und die Attribute zusammen ausdrucken.

locus_file.txt:große Datei

LOC_Os02g47020, LOC_Os03g57840,0.88725114
LOC_Os02g47020, LOC_Os07g36080,0.94455624
LOC_Os02g47020, LOC_Os03g02590,0.81881344

attr.txt: Attributdatei

blue LOC_Os02g47020
red  LOC_Os02g40830
blue LOC_Os07g36080
yellow LOC_Os03g57840
red LOC_Os03g02590

Gewünschte Ausgabe:

LOC_Os02g47020, LOC_Os03g57840,0.88725114,blue, yellow
LOC_Os02g47020, LOC_Os07g36080,0.94455624,blue, blue
LOC_Os02g47020, LOC_Os03g02590,0.81881344,blue, red

Beachten Sie: In der ersten Zeile der gewünschten Ausgabe hat beispielsweise die vierte Spalte die Farbe LOC_Os02g47020 aus atrr.txt und die fünfte Spalte die Farbe LOC_Os03g57840 aus atrr.txt

Antwort1

Eine awkLösung:

$ awk '
FNR == NR {a[$2] = $1;next}
{
    split($1,f1,",");
    split($2,f2,",");
    print $0,a[f1[1]],a[f2[1]];
}' OFS=, attr.txt locus_file.txt
LOC_Os02g47020, LOC_Os03g57840,0.88725114,blue,yellow
LOC_Os02g47020, LOC_Os07g36080,0.94455624,blue,blue
LOC_Os02g47020, LOC_Os03g02590,0.81881344,blue,red

Antwort2

Die Aufgabe riecht nach einem Job für awk:

$ cat locus_file.txt 
LOC_Os02g47020, LOC_Os03g57840,0.88725114
LOC_Os02g47020, LOC_Os07g36080,0.94455624
LOC_Os02g47020, LOC_Os03g02590,0.81881344
$ cat attr.txt 
blue LOC_Os02g47020
red  LOC_Os02g40830
blue LOC_Os07g36080
yellow LOC_Os03g57840
red LOC_Os03g02590
$ awk 'BEGIN { while(getline<"attr.txt">0) c[$2]=$1 ; FS=",[ ]*" ; OFS=", " } { print $1,$2,$3,c[$1],c[$2] }' locus_file.txt 
LOC_Os02g47020, LOC_Os03g57840, 0.88725114, blue, yellow
LOC_Os02g47020, LOC_Os07g36080, 0.94455624, blue, blue
LOC_Os02g47020, LOC_Os03g02590, 0.81881344, blue, red

Wenn Sie "," statt "," oder etwas anderes möchten, ändern Sie einfach OFS:

$ awk 'BEGIN { while(getline<"attr.txt">0) c[$2]=$1 ; FS=",[ ]*" ; OFS="," } { print $1,$2,$3,c[$1],c[$2] }' locus_file.txt 
LOC_Os02g47020,LOC_Os03g57840,0.88725114,blue,yellow
LOC_Os02g47020,LOC_Os07g36080,0.94455624,blue,blue
LOC_Os02g47020,LOC_Os03g02590,0.81881344,blue,red

Antwort3

Wie wäre es mit etwas wie

declare -A attr

while read x y; do attr[$y]="$x"; done < attr.txt

Dann

while IFS=' ,' read a b c; do 
  d=${attr[$a]}
  e=${attr[$b]} 
  printf "%s, %s,%s,%s, %s\n" "$a" "$b" "$c" "$d" "$e"
done < locus_file.txt

verwandte Informationen