2012-12-28 14 views
5

Ecco un'altra domanda noob. Ho un file come questospostamento di ogni seconda riga in una nuova colonna con awk

 
John 
30 
Mike 
0.0786268 
Tyson 
0.114889 
Gabriel 
0.176072 
Fiona 
0.101895 

ho bisogno di spostare ogni seconda fila per una nuova colonna e quindi dovrebbe assomigliare a questo

 
John 30 
Mike 0.0786268 
Tyson 0.114889 
Gabriel 0.176072 
Fiona 0.101895 

ho solo ora che awk 'NR%2==0' stamperanno ogni seconda fila, qualcuno potrebbe suggeriscimi come spostarli in una nuova colonna come sopra. Qualsiasi aiuto è più apprezzato.

+0

correlati, ma non awk specifica: http://stackoverflow.com/questions/8522851/concise-and-portable-join-on-the-unix-command-line –

risposta

1

Un modo è:

awk '{ printf("%-10s ",$0); if(NR%2==0) printf("\n");}' file 

See it

+0

Grazie per l'uno di linea, funziona davvero bene Ho appena iniziato ad imparare awk e se potessi chiedervi un po 'di più, immagino che printf ("% - 10s", $ 0) stamperà ogni cosa in una riga, ma dopo non riuscivo a capire. Grazie ancora. – Amit

+0

'printf' stampa senza una nuova riga e'% s' è la specifica di formato per una stringa. '% -10s' eseguirà il rilievo con spazi fino a una lunghezza di 10, giustificato a sinistra, o troncerà una stringa più lunga. In realtà avrei 'printf ("% s ", $ 0)' invece, con uno spazio dopo% s, in alternativa un carattere di tabulazione, '\ t'. – tripleee

+1

printf è un builtin, non una funzione, quindi i() non fanno ciò che pensate che facciano, il punto e virgola finale è superfluo, e il modo per stampare una newline è 'print '". –

0

sed è meglio per farlo che awk:

sed 'N;s/\n/ /g' yourfile 

anche in awk:

awk '{if(NR%2!=0){p=""}else{p="\n"};printf $0" "p}' your_file 

controllare anche un altro soluzione here

+0

grazie funziona come un fascino – Amit

+2

sed NON è meglio fare questo che awk in quanto NON è nemmeno vicino a come lo faresti in awk. –

1

sarei tentato di utilizzare sed come questo:

sed 'N;s/\n/ /' file 

Tuttavia, questo non sarà ben formattare i dati. Si potrebbe pipe in column -t:

< file sed 'N;s/\n/ /' | column -t 

Ma questo sembra inutile. Sarebbe meglio usare paste come questo:

paste - - < file 

Risultati:

John 30 
Mike 0.0786268 
Tyson 0.114889 
Gabriel 0.176072 
Fiona 0.101895 
+0

Grazie, non sapevo che si poteva fare con paste – Amit

3

xargs poteva farlo, la riga di comando è davvero breve:

xargs -n2 < file 
0
awk 'NR%2{s=$0; next} {print s, $0}' file 

o utilizzando default action

awk 'NR%2{s=$0; next} {$0=s" "$0}1' file 
0
paste - - <file> newfile 

pasta scheda utilizza come separatore di default.

6
awk '{printf "%s%s",$0,(NR%2?FS:RS)}' file 
+1

Questa è un'illustrazione eccellente ed elegante di AWK. Nessuna altra soluzione si avvicina. –

+0

Questa soluzione si basa sui valori predefiniti di FS e RS che sono rispettivamente uno spazio e una nuova riga. – Tom

+1

+1 Questo è geniale. –

Problemi correlati