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 awk
Lö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