mișcarea fiecărui al doilea rând într-o coloană nouă cu awk

Aici este o altă întrebare noob. Am un dosar ca acesta

John
30
Mike
0.0786268
Tyson
0.114889
Gabriel
0.176072
Fiona
0.101895

Trebuie să schimb fiecare al doilea rând într-o coloană nouă, așa că ar trebui să arate așa

John   30
Mike   0.0786268
Tyson  0.114889
Gabriel 0.176072
Fiona   0.101895

Tocmai atunci awk 'NR% 2 == 0' va imprima la fiecare al doilea rând, ar putea cineva să-mi sugereze cum să le schimb într-o coloană nouă așa cum am spus mai sus. Orice ajutor este cel mai apreciat.

5
Aspecte asemănătoare, dar nu specifice: stackoverflow.com/questions/8522851/…
adăugat autor Michael J. Barber, sursa

7 răspunsuri

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

Explicaţie:

  • printf will not include a new line character at the end of line (unlike print)
  • (NR%2?FS:RS) decides new line (RS) or field seperator (FS) based on NR%2

If your colmns should be seperated by \t

awk '{printf "%s%s",$0,NR%2?"\t":RS}'
7
adăugat
Această soluție se bazează pe valorile implicite ale FS și RS, care sunt respectiv un spațiu și o linie nouă.
adăugat autor Tom, sursa
+1 Este genial.
adăugat autor jaypal singh, sursa
Aceasta este o ilustrație excelentă și elegantă a AWK. Nici o altă soluție nu se apropie.
adăugat autor Greg A. Woods, sursa
Acest lucru ma ajutat. Vă mulțumim @ ed-Morton
adăugat autor Hsehdar, sursa

xargs ar putea face acest lucru, linia de comandă este într-adevăr scurt:

xargs -n2 < file
3
adăugat

O modalitate este:

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

Consultați

1
adăugat
printf este o funcție încorporată, nu o funcție, astfel încât() să nu facă ceea ce credeți că o face, semi-colonul final este superfuzibil, iar modul de imprimare a unei linii noi este print "" .
adăugat autor Ed Morton, sursa
printf imprimă fără o linie nouă și % s este specificația formatului pentru un șir. % - 10s va introduce cu spații la o lungime de 10, justificată la stânga sau va trunchia un șir mai lung. De fapt, ar trebui să scriu printf ("% s", $ 0) , cu un spațiu după% s, alternativ cu un caracter tab, \ t .
adăugat autor tripleee, sursa
Mulțumesc pentru linia unică, chiar funcționează bine. Tocmai am început să învăț awk și dacă aș putea să vă întreb ceva mai mult, cred că printf ("% - 10s", $ 0) va imprima fiecare lucru într-o linie, dar nu am putut înțelege după asta. Multumesc din nou.
adăugat autor Amit, sursa

Aș fi tentat să folosesc sed astfel:

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

Cu toate acestea, acest lucru nu vă va formata frumos datele. Ați putea să o introduceți în coloana -t :

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

Dar acest lucru pare inutil. Ar fi mai bine să utilizați paste astfel:

paste - - < file

Rezultate:

John    30
Mike    0.0786268
Tyson   0.114889
Gabriel 0.176072
Fiona   0.101895
1
adăugat
Mulțumesc, nu știam că se poate face cu pastă
adăugat autor Amit, sursa

sed este mai bine să faci asta decât awk:

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

de asemenea, în awk:

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

also check another solution here

0
adăugat
sed NU este mai bine să faci asta decât awk, deoarece NU este nici măcar aproape de cum ai face-o în awk.
adăugat autor Ed Morton, sursa
mulțumesc că lucrează ca un farmec
adăugat autor Amit, sursa
paste - - < file > newfile

pastă utilizează fila ca separator în mod implicit.

0
adăugat
awk 'NR%2{s=$0; next} {print s, $0}' file

or using default action

awk 'NR%2{s=$0; next} {$0=s" "$0}1' file
0
adăugat