2017-10-16 2 views
0

Der Versuch, mehrere Zeilen basierend auf der ersten Spalte in 1 zusammenzuführen.Zusammenführen einer Spalte aus mehreren Zeilen basierend auf einer anderen Spalte

Ex. File1

S784 CHST5,TMEM231 
S784 TM4SF20 
S784 TMEM184A 
U531 5S_rRNA,C3orf33 
U604 LRRC69 
U586 PLEKHA5,C8orf77 
U586 ZNF252,LINGO2 

Ausgabedatei

S784 CHST5,TMEM231,TM4SF20,TMEM184A 
U531 5S_rRNA,C3orf33 
U604 LRRC69 
U586 PLEKHA5,C8orf77,ZNF252,LINGO2 

Das ist, was ich bisher habe, das funktioniert aber mir ein zusätzliches Komma gibt ich nicht scheinen, um herauszufinden, wie kann man loswerden ...

awk -F'\t' '{a[$1]++; list[$1]=list[$1]","$2} END {for (i in a) print i,FS,list[i]}' File1 > output 

Stromausgang

S784 ,CHST5,TMEM231,TM4SF20,TMEM184A 
U531 ,5S_rRNA,C3orf33 
U604 ,LRRC69 
U586 ,PLEKHA5,C8orf77,ZNF252,LINGO2 

Ich habe auch versucht list[$1]=$2","list[$1] verwenden, aber das gibt mir noch ein zusätzliches Komma nur am Ende statt am Anfang der Spalte 2.

Antwort

0

Awk Lösung:

awk -F'\t' '{ a[$1]=($1 in a? a[$1]",":"")$2 }END{ for(i in a) print i,a[i] }' OFS='\t' file 
  • a[$1] - Array a wird mit dem ersten Feldwert indiziert $1

  • ($1 in a? a[$1]",":"")$2 - während sie durch die Aufzeichnungen che Iterieren ck, wenn der aktuelle Schlüssel $1 bereits in Array a (durchgeführt von ternären Zustand $1 in a?), wenn der so ist - unter Verwendung , als Trenner $2 den vorherigen Wert a[$1] mit aktuellem Wert verketten; sonst - nur mit dem aktuellen Wert zuweisen $2


Der Ausgang:

U604 LRRC69 
U586 PLEKHA5,C8orf77,ZNF252,LINGO2 
U531 5S_rRNA,C3orf33 
S784 CHST5,TMEM231,TM4SF20,TMEM184A 
+0

Ihre genial sind. Vielen Dank. Würde es Ihnen etwas ausmachen, zu erklären, was Ihr Code macht, damit ich mehr verstehen kann und hoffentlich weniger Fragen stellen muss? – Catherine

+0

@Catherine, willkommen, siehe meine Erklärung – RomanPerekhrest

Verwandte Themen