Ich habe den folgenden Dateityp:
transcr_25793 +
YAL039C -
transcr_25793 +
YAL037C-B -
transcr_20649 +
YBL100C -
transcr_7135 +
YBL029C-A -
transcr_11317 +
YBL067C -
transcr_25793 +
YAL038W +
transcr_7135 +
YBL029W +
Ich habe versucht, so etwas zu bekommen:
transcr_7135 +
YBL029C-A -
transcr_7135 +
YBL029W +
transcr_11317 +
YBL067C -
transcr_20649 +
YBL100C -
transcr_25793 +
YAL039C -
transcr_25793 +
YAL037C-B -
transcr_25793 +
YAL038W +
Danach suchte ich nach so etwas:
transcr_7135 +
YBL029C-A -
YBL029W +
transcr_11317 +
YBL067C -
transcr_20649 +
YBL100C -
transcr_25793 +
YAL039C -
YAL037C-B -
YAL038W +
Ich habe durch das sort
Handbuch und einige Beiträge gescrollt, konnte aber nichts finden, was dazu passt. Ich habe nur sort
numerische Werte verwendet, um ungerade Linien zu erhalten ...
text-processing
sort
Lucas Farinazzo Marques
quelle
quelle
Reine
gawk
Lösung:Der Trick besteht darin, die Indizes des Arrays
a
mit Hilfe desgawk
speziellen Arrays PROCINFO von numerisch zu sortieren .Übrigens, es ist schade, dass awk keine Option zum natürlichen Sortieren bietet, auch bekannt als Versionssortierung (nach Text mit Zahlen).
quelle
Mit GNU
sort
und unter der Annahme, dass die Zeilen keine TAB-Zeichen enthalten:Oder
sort -t$'\t' -sk1,1V
um die ursprüngliche Reihenfolge für Einträge mit identischen ungeraden Zeilen wie in Ihrer erwarteten Ausgabe beizubehalten.Wenn Sie nicht GNU haben
sort
, und unter der Annahme , die ungeraden Zeilen immer diesem Muster folgen, können Sie ersetzensort -V
mitsort -k1.9n
.quelle
Wobei a.txt Ihre Eingabe ist. Geprüft:
quelle
transcr_45 Usage: grep [OPTION]... PATTERN [FILE]... Try 'grep --help' for more information. transcr_193 Usage: grep [OPTION]... PATTERN [FILE]... Try 'grep --help' for more information. transcr_231 Usage: grep [OPTION]... PATTERN [FILE]... Try 'grep --help' for more information. transcr_282 Usage: grep [OPTION]... PATTERN [FILE]... Try 'grep --help' for more information.
und so weiter ... Weißt du was ich tun kann?Vor- und Nachbearbeitung mit
awk
; Dies setzt nicht voraus, dass auf einetranscr
Zeile nur eineY*
Zeile folgt. Es ist auch idempotent - seine Ausgabe könnte als Eingabe zurückgeleitet werden und es wird das gleiche Ergebnis liefern.quelle
Gestatten Sie mir, Ihr Problem noch einmal zu wiederholen. Sie möchten wirklich zwei Operationen ausführen:
transcr*
) Zeilen nach der Nummer in der Zeile, wobei Sie die geradzahligen (Y*
) Zeilen beibehalten, die der vorherigen Zeile zugeordnet sindY*
Linien zusammen, die unter identischetranscr*
Linien fallenWährend ich die einzeiligen Lösungen in den anderen Antworten bewundere, denke ich, dass dies komplex genug ist, um das Schreiben eines Skripts zu rechtfertigen. Sobald Sie das Skript in einer Datei gespeichert haben, können Sie es wiederverwenden und erweitern, wenn sich Ihre Anforderungen ändern.
Dieses Skript nimmt Ihre Eingabe und erzeugt Zeilen, die mit Ihrer endgültigen Ausgabe identisch sind:
Laufen Sie mit:
quelle