Transpose rows into column in unix

后端 未结 7 2101
耶瑟儿~
耶瑟儿~ 2021-02-10 18:36

I have input file which is given below

Input file

10,9:11/61432568509
118,1:/20130810014023
46,440:4/GTEL
10,9:11/61432568509
118,1:/20130810014023
46,44         


        
相关标签:
7条回答
  • 2021-02-10 18:47

    if each of your "data block" has 3 lines, you could do:

    sed -n 'N;N;s/\n/,/g;p' file
    

    if you love awk:

    awk 'NR%3{printf "%s,",$0;next}7' file
    
    0 讨论(0)
  • 2021-02-10 18:48

    A short awk version

    awk 'ORS=NR%3?",":RS' file
    

    Shortened, thanks to iiSaymour

    0 讨论(0)
  • 2021-02-10 18:52

    One way with awk:

    $ awk -v RS= -F'\n' 'BEGIN{OFS=","}{for (i=1;i<=NF; i=i+3) {print $i,$(i+1),$(i+2)}}' file
    10,9:11/61432568509,118,1:/20130810014023,46,440:4/GTEL
    10,9:11/61432568509,118,1:/20130810014023,46,440:4/GTEL
    

    It defines each field to be a line. Hence, it prints them on blocks of three.

    0 讨论(0)
  • 2021-02-10 18:57
    > sed 'N;N;s/\n/,/g' your_file
    
    0 讨论(0)
  • 2021-02-10 19:05

    With pr:

    $ pr -ats, file --columns 3  
    10,9:11/61432568509,118,1:/20130810014023,46,440:4/GTEL
    10,9:11/61432568509,118,1:/20130810014023,46,440:4/GTEL
    

    With args and tr:

    $ xargs -n3 < file | tr ' ' ,
    10,9:11/61432568509,118,1:/20130810014023,46,440:4/GTEL
    10,9:11/61432568509,118,1:/20130810014023,46,440:4/GTEL
    
    0 讨论(0)
  • 2021-02-10 19:11

    Using awk:

    $ awk 'ORS=(NR%3==0)?"\n":","' inputfile
    10,9:11/61432568509,118,1:/20130810014023,46,440:4/GTEL
    10,9:11/61432568509,118,1:/20130810014023,46,440:4/GTEL
    

    EDIT: As commented by sudo_O and Ed Morton, the following variant is more portable:

    $ awk 'ORS=(NR%3?",":RS)' inputfile
    10,9:11/61432568509,118,1:/20130810014023,46,440:4/GTEL
    10,9:11/61432568509,118,1:/20130810014023,46,440:4/GTEL
    
    0 讨论(0)
提交回复
热议问题