her ikinci sırayı awk ile yeni bir sütuna taşıma

İşte başka bir noob sorusu. Böyle bir dosyam var

John
30
Mike
0.0786268
Tyson
0.114889
Gabriel
0.176072
Fiona
0.101895

Her ikinci satırı yeni bir sütuna kaydırmalıyım, bu yüzden böyle görünmelidir

John   30
Mike   0.0786268
Tyson  0.114889
Gabriel 0.176072
Fiona   0.101895

Ben şimdi awk 'NR% 2 == 0' her ikinci satırı yazdıracak, birisi bana yukarıdaki gibi yeni bir sütuna nasıl kaydırılacağını önerebilir. Herhangi bir yardım en çok takdir edilir.

5
İlgili, ama garip belirli değil: stackoverflow.com/questions/8522851/…
katma yazar Michael J. Barber, kaynak

7 cevap

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

Açıklama:

  • 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
katma
Bu çözüm, sırasıyla bir boşluk ve yeni satır olan FS ve RS'nin varsayılan değerlerine dayanır.
katma yazar Tom, kaynak
+1 Bu harika.
katma yazar jaypal singh, kaynak
Bu, AWK'nın en mükemmel ve zarif bir örneğidir. Başka hiçbir çözüm yaklaşmıyor.
katma yazar Greg A. Woods, kaynak
Bu bana yardımcı oldu. Teşekkürler ed-Morton
katma yazar Hsehdar, kaynak

xargs yapabilirdi, komut satırı gerçekten kısa:

xargs -n2 < file
3
katma

Tek yol:

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

Görmek

1
katma
printf, bir işlev değil, bir işlevdir, bu nedenle() yaptığınızı düşündüğünüz şeyi yapmaz, sondaki iki nokta üst üste gelir ve yeni satır yazdırmanın yolu print "" olur.
katma yazar Ed Morton, kaynak
printf , bir satırsonu olmadan yazdırılır ve % s bir dizge için biçim belirtimidir. % - 10s , 10 uzunluğa boşluk bırakacak, sola yaslanacak veya daha uzun bir dizgeyi kırpacak. Aslında printf ("% s", $ 0) yerine,% s sonra bir boşluk ile, alternatif olarak \ t sekme karakteri olurdum.
katma yazar tripleee, kaynak
Bir astar için teşekkürler, gerçekten iyi çalışıyor. Sadece awk öğrenmeye başladım ve eğer biraz daha fazla sorabilirsem, sanırım printf ("% - 10s", $ 0) her şeyi bir satırda yazdı, ama bundan sonra anlayamadım. Tekrar teşekkürler.
katma yazar Amit, kaynak

sed 'i şöyle kullanabilirim:

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

Ancak, bu verilerinizi güzel bir şekilde biçimlendirmez. Bunu column -t içine gönderebilirsiniz:

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

Ama bu gereksiz görünüyor. Bunun gibi paste kullanmak daha iyi olurdu:

paste - - < file

Sonuçlar:

John    30
Mike    0.0786268
Tyson   0.114889
Gabriel 0.176072
Fiona   0.101895
1
katma
Teşekkürler, yapıştırın ile yapılabileceğini bilmiyordum
katma yazar Amit, kaynak

sed awk yapmaktan daha iyidir:

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

aynı zamanda awk:

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

also check another solution here

0
katma
Sed awk yapmak nasıl daha yakın olduğu için bu awk daha yapmak için daha iyi değil.
katma yazar Ed Morton, kaynak
teşekkür ederim bir çekicilik gibi çalışır
katma yazar Amit, kaynak
paste - - < file > newfile

Yapıştır, varsayılan olarak sekmeyi bir ayırıcı olarak kullanır.

0
katma
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
katma