Frage

Ich brauche Ihre Hilfe in einem mehrfachen Zeileneintrag in verschiedene Spalten. Und machen Sie dasselbe mit allen Einträgen in der Datei.

Dateibeispiel (nur 2 Einträge zeigt viele solche):

>ABC
*
AGA-AUUCUC-CGGUUCAAUCU
|||
UCUAUAACCGCGCCGAGUUAGU

>ABC
*
AGAUAU-GCUGCAGGCUCAAUUG
||||||
UCUAUAACCGCG-CCGAGUUAGU

Dateiformat erforderlich:

>ABC AGA-AUUCUC-CGGUUCAAUCU UCUAUAACCGCGCCGAGUUAGU
>ABC AGAUAU-GCUGCAGGCUCAAUUG UCUAUAACCGCG-CCGAGUUAGU

Ich kann einen einzelnen Eintrag in das erforderliche Format umwandeln nach:

tr '\n' '\t' <test3 | awk '{print $1,$3,$5}'

Aber wie mache ich das mit allen Einträgen, indem ich ganze Datei liest?

War es hilfreich?

Lösung

Ich glaube, Sie waren mit Ihrem Original auf dem richtigen Weg awk Lösung. Versuche dies; Ich denke, es ist eine gute Kombination aus lesbar und effektiv:

awk 'BEGIN { RS="\n\n" } ; { print $1, $3, $5 }' < myfile

Die Idee ist, awk zu sagen, dass er die leeren Linien (2 aufeinanderfolgende Neulinge) als Rekordtrenntrennzeichen behandeln soll. Dann wird jede Strophe als einzelne Aufzeichnung behandelt, und die Whitespace (in diesem Fall einzelne Neuleitungen) trennt die Felder. Dies ist ziemlich ähnlich wie das, mit dem Sie getan haben tr, Außer jetzt wird awk die gesamte Datei durchlaufen, die jeweils eine Strophe verarbeitet.

Andere Tipps

Sie können verwenden awk so was:

awk 'NR%2 { printf "%s%s", $0, (NR+1)%6 ? " " : "\n" }' < test


Erläuterung:

Sie müssen diese beiden Dinge wissen awk:

  • Die Syntax ist condition { commands }, wo commands werden ausgeführt, wenn condition ist wahr (ungleich Null).

  • NR ist die Anzahl des aktuellen Datensatzes (dh die Zeilennummer), beginnend mit 1.


Hier ist der Zustand NR%2, was ungleich Null für ungerade Zahlen ist. Der Befehl wird also nur für ungerade Zeilen ausgeführt, die Sie drucken möchten. Die gerade zahlreichen Linien werden lautlos verworfen.

Das printf Drucken Sie jede seltsame Linie, gefolgt von einem Raum oder einer neuen Linie. Ihre Eingabe wiederholt sich alle 6 Zeilen, und Sie möchten eine neue Zeile nach den Zeilen 5, 11, 17. etc. Sie können jeder dieser Zahlen 1 hinzufügen, um sie durch 6 teilbar zu machen, also die Formel (NR+1)%6 ist 0 für diese Zahlen.

So (NR+1)%6 ? " " : "\n" bewertet einen Raum für die Zeilen 1 und 3 und eine neue Zeile für Zeile 5. Dann wiederholt es sich für 7, 9 und 11; usw.

Hier ist eine Möglichkeit mit Perl:

perl -ne 'chomp; if($. % 2 == 1) { print $_, ($. % 6 == 5) ? "\n" : "\t" }'

Dadurch werden die 1., 3., 5., 7. usw. Zeilen der Datei gedruckt. Nach dem 5., 11., 17. usw. Zeilen wird es eine neue Linie drucken; Nach anderen Zeilen druckt es nur eine Registerkarte.

(Hinweis: Dies geht davon aus, dass es genau eine leere Linie zwischen aufeinanderfolgenden Gruppen von fünf Zeilen gibt. Wenn das ist nicht Der Fall, dann klären Sie bitte.)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top