2017-08-06 1 views
1

alle!Entfernen Sie die Duplikate und behalten Sie die Zeile, die den maximalen Wert enthält, aus einer Spalte - LINUX

Ich möchte Duplikate entfernen und Zeilen mit dem höchsten Wert aus einer Spalte (4. Spalte) in einer Datei mit 4 Feldern behalten. Ich muss dies in einem Linux-Server tun.

Vor

gene subj e-value ident 
    g1 h1 0.05 75.5 
    g1 h2 0.03 60.6 
    g2 h7 0.00 80.5 
    g2 h9 0.00 50.3 
    g2 h4 0.03 90.7 
    g3 h5 0.10 30.5 
    g3 h8 0.00 76.8 
    g4 h11 0.00 80.7 

Nach

gene subj e-value ident 
    g1 h1 0.05 75.5 
    g2 h4 0.03 90.7 
    g3 h8 0.00 76.8 
    g4 h11 0.00 80.7 

Vielen Dank und es tut mir leid, wenn ich etwas wiederholt gefragt! Aber ich habe keine Antwort auf mein Problem gefunden.

+2

was haben u versucht? – tso

+0

Ive versuchte Befehle basierend auf awk, wie 'cat blast_selected_split0_outfmt6.txt | awk -F '\ t' '{if ($ 1 $ 3 in a) {if ($ 7> a [$ 1 $ 3]) {a [$ 1 $ 3] = $ 7; r [$ 1 $ 3] = $ 0;}} sonst if ($ 3 $ 1 in a) {if ($ 7> a [$ 3 $ 1]) {a [$ 3 $ 1] = $ 7; r [$ 3 $ 1] = $ 0;}} sonst {a [$ 1 $ 3] = $ 7; r [$ 1 $ 3] = $ 0;}} END {für (x in r) print r [x]} '' –

+0

Aber es hielt Duplikate –

Antwort

2

Sie können dies versuchen, wenn es kein Problem ist, die Ausgabe ohne den Header zu bekommen:

tail -n +2 file.txt | sort -k1,1 -k4,4rn | sort -uk1,1 

Erläuterung:

tail -n +2 file.txt 

werden die Header entfernen, so dass sie in all die Sortierung nicht einlassen.

sort -k1,1 -k4,4rn 

wird durch Spalte 1 zuerst sortieren (-k1,1) und dann durch Spalte 4 numerisch und in umgekehrter Reihenfolge (-k4,4rn)

Endlich:

sort -uk1,1 

Werden Duplikate entfernen berücksichtigt nur die erste Spalte.

Beachten Sie, dass -k1,1 bedeutet von Spalte eins zu Spalte eins, daher -k4,4 ist von Spalte 4 bis Spalte 4. Passen Sie an Ihre Spalten anpassen.

+0

Vielen Dank! Duplikate wurden entfernt, aber in der 7. Spalte wurde der größte Wert nicht berücksichtigt. Eigentlich ist meine Datei größer als Beispiel (sie hat 7 Spalten), ich habe sie zu einer 4-Spalten-Datei vereinfacht. Also habe ich diesen Befehl benutzt: 'tail -n +2 file.txt | sortieren -k1,1 -k4,4rn | sort -uk1,1. Stimmt irgendetwas nicht? –

+0

@M.Sobreiro Meine Antwort aktualisiert, um eine Erklärung hinzuzufügen, hoffe, dass es Ihnen hilft. Ich denke, was du willst, ist 'tail -n +2 file.txt | sortieren -k1,1 -k7,7rn | sort -uk1,1' – archemiro

+0

Vielen Dank für Ihre Aufmerksamkeit und Hilfe !!! –

0

Mit GNU datamash Werkzeug:

datamash --headers -Wfs -g1 max 4 < file | cut -f1-4 

Der Ausgang:

gene subj e-value ident 
g1 h1 0.05  75.5 
g2 h4 0.03  90.7 
g3 h8 0.00  76.8 
g4 h11 0.00  80.7 
+0

Vielen Dank! Ich werde es versuchen!! –

0

Eine awk Lösung, aber ich mag Archimiro-Version für die Einfachheit.

awk ' 
    NR>1 && $1 in arr { 
     if ($4 > arr[$1][4]) 
      split($0, arr[$1]) 
     next 
    } 

    NR>1 { 
     arr[$1][1] = "" 
     split($0, arr[$1]) 
    } 

    END { 
     for(i in arr) { 
      for(j in arr[i]) 
       printf arr[i][j] "\t" 
      print "" 
     } 
    } 
' data.file 

Das Ergebnis:

g1 h1 0.05 75.5  
g2 h4 0.03 90.7  
g3 h8 0.00 76.8  
g4 h11 0.00 80.7  
+0

Vielen Dank !!! –

Verwandte Themen