2016-08-19 9 views
0

Ich habe eine Datei mit fast 900 Zeilen in Excel, die ich als Tab-getrennt. TXT-Datei gespeichert habe. Ich möchte die Textdatei nach den Zahlen in der ersten Spalte sortieren (sie liegen zwischen 0 und 2250). Die anderen Spalten sind sowohl Zahlen als auch Buchstaben unterschiedlicher Länge, z.Sortieren numerisch nach erster Zeile

myfile.txt:

0251 abcd 1234,24 bcde 
2240 efgh 2345,98 ikgpppm 
0001 lkjsi 879,09 ikol 

Ich habe

versucht
sort -k1 -n myfile.txt > myfile_num.txt 

aber bekomme ich nur eine identische Datei mit neuen Namen. Ich möchte bekommen:

myfile_num.txt

0001 lkjsi 879,09 ikol 
0251 abcd 1234,24 bcde 
2240 efgh 2345,98 ikgpppm 

Was mache ich falsch? Ich schätze, dass es ganz einfach ist, aber ich würde jede Hilfe, die ich bekommen kann, schätzen! Ich kenne nur ein wenig Bash Scripting, so wäre es schön, wenn das Skript ein sehr einfacher Einzeiler, die ich verstehen kann :)

Thanks :)

+1

Ich lief es auf meinem Rechner und es funktioniert wie es soll. Können Sie versuchen mit: 'sort -k1 -h myfile.txt> meinedatei.txt'? –

+0

können Sie versuchen mit 'sort -k1 -t \ t'? Problem beim Einfügen von durch Tabulatoren getrennten Dateien ist, dass Registerkarten in Leerzeichen konvertiert werden. Sollte aber funktionieren, weil hier numerisch = string wegen der Nullen. –

+0

versuchen Sie 'sort' ohne irgendwelche Optionen. – karakfa

Antwort

1

Verwenden Sie diesen alten Mac OS Wagenrücklauf konvertieren zu newline:

tr '\r' '\n' < myfile.txt | sort 
+0

Wäre es möglich, dass Sie mir dabei auch helfen? Im folgenden proteins.txt möchte ich das gleiche tun, aber es funktioniert nicht. Es gibt mir nur die ersten 200 Zeilen Ausgabe und Terminal schreibt "tr: ​​Illegale Byte-Sequenz" ... https://www.dropbox.com/s/umzx64c5ix90l3y/Proteins.txt?dl=0 – Ditte

+0

Ich sah mich um und sah, dass Der Befehl tr könnte mit besser funktionieren.csv, aber es macht nichts anderes und gibt mir immer noch die "tr: ​​illegal byt sequence", wenn ich den Befehl verwende, den Sie in meiner neuen verknüpften Datei vorschlagen ... irgendwelche anderen Vorschläge für die Verwendung des Befehls in meiner großen Datei? – Ditte

+0

Ich empfehle, eine neue Frage mit dieser Nicht-ISO-ASCII-Datei zu starten. – Cyrus

0

Wie here erwähnt können Sie Probleme damit haben (und in der anderen pseudo-Follow-up-Duplikat question fragte Sie, ja, du hast)

tr '\r' '\n' < myfile.txt | sort -n 

Es fein hier auf MSYS funktioniert, aber auf einigen Plattformen kann man hinzufügen:

export LC_CTYPE=C 

oder tr wird die Datei als Textdatei, betrachten und wahrscheinlich wird es Tag als korrupt nach der max Linie Grenze erreicht hat .

Offensichtlich konnte ich es nicht testen, aber ich bin zuversichtlich, dass es das Problem lösen wird, das gegeben wird, was ich auf der verbundenen Antwort lese.

+0

also verwende ich den Befehl: tr '\ r' '\ n' myfile_num.txt um es zu speichern? – Ditte

+0

Wenn ich "LC_CTYPE = C tr '\ r' '\ n' Myfile_num.txt" verwende ich nur eine Reihe von Ausgabedaten ... – Ditte

0

Ein Python-Ansatz (Python 2 & 3 kompatibel), immun gegen alle Shell-Probleme. Funktioniert gut und tragbar. Ich habe bemerkt, dass die Eingabedatei einige '0x8C' Zeichen (exotische Punkte) hat, wahrscheinlich verwirrend tr Befehl. , die richtig unter behandelt wird:

import csv,sys 

# read the file as binary, as it is not really text 
with open("Proteins.txt","rb") as f: 
    data = bytearray(f.read()) 
    # replace 0x8c char by classical dots 
    for i,c in enumerate(data): 
     if c>0x7F: # non-ascii: replace by dot 
      data[i] = ord(".") 

    # convert to list of ASCII strings (split using the old MAC separator) 
    lines = "".join(map(chr,data)).split("\r") 

    # treat our lines as input for CSV reader 
    cr = csv.reader(lines,delimiter='\t',quotechar='"') 

    # read all the lines in a list  
    rows = list(cr) 
    # perform the sort (tricky) 
    # on first row, numerical, removing the leading 0 which is illegal 
    # in python 3, and if not numerical, put it at the top 

    rows = sorted(rows,key=lambda x : x[0].isdigit() and int(x[0].strip("0"))) 

# write back the file as a nice, legal, ASCII tsv file 

if sys.version_info < (3,): 
    f = open("Proteins_sorted_2.txt","wb") 
else: 
    f = open("Proteins_sorted_2.txt","w",newline='') 

cw = csv.writer(f,delimiter='\t',quotechar='"') 
cw.writerows(rows) 
f.close() 
+0

ahh ... Ich habe nur Python 2.7 auf meinem osx :( – Ditte

+0

funktioniert jetzt für beide Versionen. –

Verwandte Themen