Domanda

ho bisogno del vostro aiuto su una voce di fila multipli in diverse colonne. E fare lo stesso con tutte le voci nel file.

Esempio di file (mostrando 2 solo le voci, ci sono molti come questi):

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

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

Formato file richiesto:

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

Sono in grado di convertire l'ingresso singolo in formato richiesto da:

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

Ma come faccio lo faccio con tutte le voci leggendo tutto il file?

È stato utile?

Soluzione

Credo che eri sulla strada giusta con la soluzione awk originale. Prova questo; Penso che sia una buona combinazione di leggibile ed efficace:

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

L'idea è quella di raccontare awk per trattare le righe vuote (2 di ritorno a capo consecutivi) come separatori record. Poi ogni stanza è trattata come una singola record e lo spazio bianco (in questo caso, singole newline) separa i campi. Questo è abbastanza simile a quello che stavi facendo con tr, solo che adesso awk verrà eseguito attraverso l'intero file di elaborazione una strofa alla volta.

Altri suggerimenti

È possibile utilizzare awk in questo modo:

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


Spiegazione:

È necessario conoscere queste due cose su awk:

  • la sintassi è condition { commands }, dove commands sono executied se condition è vera (non zero).

  • NR è il numero del record corrente (cioè, il numero di riga), partendo da 1.


Qui, la condizione è NR%2, che è non-zero per linee dispari. Così il comando viene eseguito solo per le linee dispari, che sono quelli che si desidera stampare. Le linee di numero pari vengono scartate silenziosamente.

Il printf stamperà ogni linea dispari, seguito da uno spazio o un ritorno a capo. Il vostro contributo si ripete ogni 6 linee, e si vuole un ritorno a capo dopo le linee 5, 11, 17, etc . È possibile aggiungere 1 a ciascuno di questi numeri per renderlo divisibile per 6, in modo che il (NR+1)%6 formula è 0 per questi numeri.

Quindi (NR+1)%6 ? " " : "\n" restituisce uno spazio per le linee 1 e 3, e un ritorno a capo per la linea 5. Poi si ripete per il 7, 9 e 11; e così via.

Ecco un modo utilizzando Perl:

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

che stamperà il 1 °, 3 °, 5 °, 7 °, ecc, righe del file. Dopo il 5 °, 11 °, 17 °, ecc, linee, sarà stampare una nuova riga; dopo altre linee, verrà stampata solo una scheda.

(Nota:.. Questo presuppone che ci sia esattamente una riga vuota tra i gruppi successivi di cinque linee, se questo è non il caso, allora si prega di chiarire)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top