Ich habe eine Datei, die wie folgt aussieht:
chr19 61336212 + 0 0 CG CGT
chr19 61336213 - 0 0 CG CGG
chr19 61336218 + 0 0 CG CGG
chr19 61336219 - 0 0 CG CGC
chr19 61336268 + 0 0 CG CGG
chr19 61336269 - 0 0 CG CGA
chr19 61336402 + 0 0 CG CGG
chr19 61336403 - 0 0 CG CGT
Ich möchte diese Datei für jedes 10000-Intervall des 2. Feldes aufteilen (NICHT Zeilen, sondern Zahlenintervall). Für diese Datei möchte ich also von der ersten Zeile (der Zeile mit 61336212) in die Zeile mit oder bis 61346211 (61336212 + 9999), dann von 61346212 bis 61356211 usw. aufteilen. Wie Sie sehen können, sind die Zahlen im 2. Feld / in der 2. Spalte nicht "gefüllt".
Gibt es eine Möglichkeit, dies zu tun?
text-processing
awk
split
Agathusie
quelle
quelle
Antworten:
Würde schreiben an
file.0000
,file.0001
... (die Nummer istint(($2-n)/10000)
won
ist$2
für die erste Zeile).Beachten Sie, dass wir Dateien schließen, sobald wir aufgehört haben, in sie zu schreiben, da Sie sonst die Grenze für die Anzahl gleichzeitig geöffneter Dateien nach einigen hundert Dateien erreichen würden (GNU
awk
kann diese Grenze umgehen, aber dann verschlechtern sich die Leistungen schnell).Wir gehen davon aus, dass diese Zahlen immer steigen.
quelle
file = ...
, aber wie funktioniert die Iteration? Es gibt keinen Teil, der etwas sagtn = n + 10000
oder sagtlower_boundary <= $2 < upper_boundary
. Im Allgemeinen ist das Ganzeif (file != last_file) { close(last_file) ; last_file = file }
nicht in meiner Ligaif (file != last_file)
: Wenn die aktuelle Datei nicht mit der vorherigen Datei identisch ist, schließen Sie die vorherige Datei (haben Sie also immer nur eine Datei geöffnet (wir müssen sie nicht behalten) alle offen wie andere Lösungen))Hack Einzeiler Version. Vielleicht besser für Code Golf geeignet als dieses Forum. Dadurch werden split1, split2, split3 usw. als Dateinamen generiert.
Um Ausgabedateien mit den Namen split001, split002, split003 zu erhalten, ist Folgendes erforderlich
sprintf
:Verwenden Sie Perl, um das von @ Stéphane Chazelas identifizierte Problem der Gawk-Verlangsamung zu vermeiden:
quelle
sprintf
jetzt wurde zusätzliche Magie hinzugefügt.Test mit auf 100 eingestelltem Intervall:
Hinweis: Erzeugt leere Dateien für leere Intervalle. Fügen Sie zum Entfernen leerer Dateien Folgendes hinzu:
Läuft die Datei für jeden Schritt in der
for
Schleife über, daher nicht die effizienteste.quelle
Wenn Sie nur Berechnung, nicht Zeilenzählung meinen:
quelle