Convert Data from Column to Row

Hi

FileA.txt

E_TIM	16,
ETE	15,
EOND	26,
EEC	81,
E_1	un,
E_2	un,
E_3	un,
E_4	284,
E_TIM	17,
ETE	15,
EOND	29,
EEC	82,
E_1	un,
E_2	un,
E_3	un,
E_4	249,

Output FileB.txt

E_TIM	ETE	EOND	EEC	E_1	E_2	E_3	E_4
16,	15,	26,	81,	un,	un,	un,	284,
17,	15,	29,	82,	un,	un,	un,	249,

After 8 line data will be change but first column is same.

In case Perl is an option, here's a program that does that:

$
$ cat -n f25
     1  E_TIM   16,
     2  ETE     15,
     3  EOND    26,
     4  EEC     81,
     5  E_1     un,
     6  E_2     un,
     7  E_3     un,
     8  E_4     284,
     9  E_TIM   17,
    10  ETE     15,
    11  EOND    29,
    12  EEC     82,
    13  E_1     un,
    14  E_2     un,
    15  E_3     un,
    16  E_4     249,

$
$ perl -ne 'BEGIN { $fmt = "%-8s %-8s %-8s %-8s %-8s %-8s %-8s %-8s\n" }
            if ($. % 8 == 1 and $. > 1) {
                printf($fmt, map { $_->[0] } @x);
                printf($fmt, map { $_->[1] } @x);
                @x = ();
            }
            /^(\S+)\s+(\S+)$/ and push @x, [ $1, $2 ];
            END {
                printf($fmt, map { $_->[0] } @x);
                printf($fmt, map { $_->[1] } @x);
            }
           ' f25
E_TIM    ETE      EOND     EEC      E_1      E_2      E_3      E_4
16,      15,      26,      81,      un,      un,      un,      284,
E_TIM    ETE      EOND     EEC      E_1      E_2      E_3      E_4
17,      15,      29,      82,      un,      un,      un,      249,
$
$
1 Like

Try also

awk     '/E_TIM/        {CNT++}
                        {LN[CNT]; HD[$1]; MX[CNT,$1]=$2}
         END            {               for (i in HD) printf "%10s", i; print "";
                         for (j in LN) {for (i in HD) printf "%10s", MX[j,i]; print ""}
                        }
        ' file
       ETE     E_TIM       E_1      EOND       E_2       E_3       E_4       EEC
       15,       16,       un,       26,       un,       un,      284,       81,
       15,       17,       un,       29,       un,       un,      249,       82,
1 Like

Both Code Works Perfect Thanks Guys ..

Another awk:

awk -v n=8 'NR<=n{h=h (h?OFS:x) $1} {v=v (v?OFS:x) $2} !(NR%n) {if(h){print h; h=x} print v; v=x}' OFS='\t' file
E_TIM	16,
ETE	15,
EOND	26,
EEC	81,
E	un,
E	un,
E	249,
E	19,
E_TIM	17,
ETE	15,
EOND	29,
EEC	82,
E	un,
E	un,
E	249,
E	19,


E_TIM	ETE	EOND	EEC	E	E	E	E
16,	15,	26,	81,	un,	un,	un,	284,
17,	15,	29,	82,	un,	un,	un,	249,

Same code not working with Above input

Your output does not correspond to the input.
The last two "E" values of each eight-pair are (249, and 19,) in the input.
But they are (un, and 284,) and (un, and 249,) in the output.

$
$ cat -n f26
     1  E_TIM   16,
     2  ETE     15,
     3  EOND    26,
     4  EEC     81,
     5  E       un,
     6  E       un,
     7  E       249,
     8  E       19,
     9  E_TIM   17,
    10  ETE     15,
    11  EOND    29,
    12  EEC     82,
    13  E       un,
    14  E       un,
    15  E       249,
    16  E       19,

$
$ perl -ne 'BEGIN { $fmt = "%-8s %-8s %-8s %-8s %-8s %-8s %-8s %-8s\n" }
            if ($. % 8 == 1 and $. > 1) {
                if (! $first) {
                    printf($fmt, map { $_->[0] } @x);
                    $first = 1;
                }
                printf($fmt, map { $_->[1] } @x);
                @x = ();
            }
            /^(\S+)\s+(\S+)$/ and push @x, [ $1, $2 ];
            END {
                printf($fmt, map { $_->[1] } @x);
            }
           ' f26
E_TIM    ETE      EOND     EEC      E        E        E        E
16,      15,      26,      81,      un,      un,      249,     19,
17,      15,      29,      82,      un,      un,      249,     19,
$
$