2013-11-03 17 views

risposta

4

Alcuni awk versione

awk 1 RS=" |\n" file1 # gnu awk version 
awk '{for (i=1;i<=NF;i++) print $i}' file1 # portable version 
a 
b 
c 
1 
2 
3 


awk '{printf "%s" (NR%3==0?"RS:FS),$1}' file2 
a b c 
1 2 3 

printf "%s" # stampa pararameter # 1 ($ 1)
NR%3==0?"RS:FS # aggiungere la formattazione in più. Prova se la linea è numero 3. Se non è così, usa FS (uno spazio), se è RS, una nuova linea.
Quindi questo regola il parametro successivo dopo ogni 3 linee.

+0

Come novizio di awk, non ero in grado di comprendere pienamente la soluzione per file2. Sarei grato se potesse spiegarlo – user2949699

+2

@jotne Non dimenticare la virgola che separa il formato dai dati. È più pulito usare 'FS' e' RS' e commutare l'ordine salva il confronto esplicito 'awk '{printf"% s% s ", $ 0, (NR% 3? FS: RS)}" ". –

+0

@sudo_O Sì è più pulito, non ci ha pensato. & user2949699 Ho aggiunto alcune informazioni extra per te, sperando che ne siano utili alcune. – Jotne

0

Per primo file yout, si potrebbe provare qualcosa di simile:

awk '{for (i=1 ; i <= NF ; i++) print $i}' file1.txt 

Per il vostro secondo file, si potrebbe provare qualcosa di simile:

awk 'BEGIN {str=""; i=1} {if(i%3 == 0){str=str""$0"\n"} else {str=str""$0" "} i++} END {print str}' file2.txt 

Tuttavia, mi piacerebbe fare alcune ipotesi come che tutta la Per esempio, 3 linee devono saltare una riga nell'output. Avremmo bisogno di ulteriori dettagli Penso ...

+1

Non è necessario '-F" "' dal suo valore predefinito. – Jotne

+1

Sì, ho dimenticato, modifico il mio post. Grazie :) –

9

userei xargs per questo:

$ xargs -n1 < file1 
a 
b 
c 
1 
2 
3 

$ xargs -n3 < file2 
a b c 
1 2 3 
+2

Mi è piaciuta questa soluzione per la sua semplicità. Ma cercavo una soluzione awk. – user2949699

+0

Bello ... non l'ho visto prima – ackuser

+0

Davvero questo mi piace e cerco un po 'di tempo per ottenere questa soluzione, grazie (+1) – Patric

6

L'approccio awk idiomatica semplicemente impostando dell'OFS o ORS alle FS o RS a seconda dei casi prima della stampa (e ricompilare il record, se necessario, con $1=$1) sarà funziona con qualsiasi awk:

$ cat file1 
a b c 
1 2 3 
$ awk '{OFS=RS;$1=$1}1' file1 
a 
b 
c 
1 
2 
3 
$ cat file2 
a 
b 
c 
1 
2 
3 
$ awk '{ORS=(NR%3?FS:RS)}1' file2 
a b c 
1 2 3 
Problemi correlati