2012-12-28 1 views
5

Hier ist eine weitere Frage noob. Ich habe eine Datei wie dieseVerschieben jede zweite Zeile in eine neue Spalte mit awk

 
John 
30 
Mike 
0.0786268 
Tyson 
0.114889 
Gabriel 
0.176072 
Fiona 
0.101895 

ich jede zweite Zeile auf eine neue Spalte verschieben müssen, so dass es wie dieses

 
John 30 
Mike 0.0786268 
Tyson 0.114889 
Gabriel 0.176072 
Fiona 0.101895 

ich jetzt aussehen sollte nur, dass awk 'NR%2==0' jede zweite Zeile gedruckt wird, könnte jemand schlage mir vor, wie ich sie wie oben zu einer neuen Kolumne verschieben kann. Jede Hilfe wird sehr geschätzt.

+0

Verwandte, aber nicht awk spezifisch: http://stackoverflow.com/questions/8522851/concise-and-portable-join-on-the-unix-command-line –

Antwort

1

Eine Möglichkeit ist:

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

See it

+0

Vielen Dank für das Motto, Es funktioniert wirklich gut. Ich habe gerade angefangen, awk zu lernen, und wenn ich dich etwas mehr fragen könnte, denke ich, printf ("% - 10s", $ 0) wird alles in einer Zeile drucken, aber ich konnte danach nicht verstehen. Danke noch einmal. – Amit

+0

'printf' druckt ohne Zeilenumbruch und'% s' ist die Formatangabe für eine Zeichenkette. '% -10s' wird mit Leerzeichen auf eine Länge von 10 auffüllen, linksbündig oder eine längere Zeichenfolge abgeschnitten. Ich würde stattdessen 'printf ("% s ", $ 0)' stattdessen mit einem Leerzeichen nach% s, alternativ ein Tab-Zeichen, '\ t'. – tripleee

+1

printf ist ein builtin, keine Funktion, also machen Sie das() nicht, was Sie denken, tun sie, das abschließende Semikolon ist überflüssig, und die Art, eine neue Zeile zu drucken, ist 'print '" '. –

0

sed besser ist dies als awk zu tun:

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

auch in awk:

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

auch eine andere überprüfen Lösung here

+0

danke funktioniert wie ein Charme – Amit

+2

sed ist nicht besser, dies als awk als das ist nicht einmal in der Nähe zu tun, wie Sie es in Awk tun würde. –

1

würde ich versucht sein sed wie folgt zu verwenden:

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

Dies ist jedoch nicht schön Ihre Daten formatiert. Sie könnten Rohr es in column -t:

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

Aber das scheint nicht notwendig. Es wäre besser, paste wie folgt zu verwenden:

paste - - < file 

Ergebnisse:

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

Danke, wusste nicht, dass es mit Paste – Amit

3

xargs könnte es tun, die Kommandozeile ist wirklich kurz:

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

oder mit default action

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

paste verwendet die Registerkarte standardmäßig als Trennzeichen.

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

getan werden könnte Dies ist eine sehr gute und elegante Darstellung von AWK. Keine andere Lösung kommt näher. –

+0

Diese Lösung basiert auf den Standardwerten von FS und RS, die jeweils ein Leerzeichen und ein Zeilenumbruch sind. – Tom

+1

+1 Das ist brilliant. –