Transponha linhas em colunas no formato adequado

Transponha linhas em colunas no formato adequado

Eu tenho 3 arquivos de texto comoemp id.txt, antes sal.txt, agora sal.txt. Conteúdo destes 3 arquivos: -

emp id.txt

emp id ----- 1 4 7 10 13 16 19

antes de sal.txt

before sal ----- 23 56 78 97 105 123 145

agora sal

now sal ---- 25 60 82 99 109 124 150

Usei abaixo no shell script

awk '{ for (i=1; i<=NF; i++) RtoC[i]= (RtoC[i]? RtoC[i] FS $i: $i) } END{ for (i in RtoC) print RtoC[i] }' para converter de linha para coluna, obtive uma saída como -

1 23 25
4 56 60
7 78 82
10 97 99
13 105 109
16 123 124
19 145 150
emp before now
id  sal    sal
--- -----  ----

Mas eu quero a saída no formato abaixo, como-

--------------------------------
|emp id  |before sal | now sal |
|--------|---------- | --------|
|1       | 23        |  25     |
|4       | 56        |  60     | 
|7       | 78        |  82     |
|10      | 97        |  99     |
|13      | 105       |  109    |
|16      | 123       |  124    |
|19      | 145       |  150    |
--------------------------------

Você poderia me ajudar com isso para que eu possa obter a saída no formato acima.

Responder1

step1:

for i in "emp_id.txt" "beforesal.txt" "nowsal.txt"; do perl -pne "s/ /\n/g" $i >> "$i"fi; done


step2:

paste emp_id.txtfi beforesal.txtfi nowsal.txtfi

saída

emp before  now
id  sal sal
-----   -----   ----
1   23  25
4   56  60
7   78  82
10  97  99
13  105 109
16  123 124
19  145 150

Responder2

defina uma pequena função que transforme o arquivo em uma coluna:

f2c() { tr -s '[:blank:]' '\n' < "$1"; }

então use pastepara costurar as colunas juntas,substituições de processocomo argumentos de arquivo para colar e columnpara uma saída bonita.

paste <(f2c 'emp id.txt') <(f2c 'before sal.txt') <(f2c 'now sal.txt') | column -t
emp    before  now
id     sal     sal
-----  -----   ----
1      23      25
4      56      60
7      78      82
10     97      99
13     105     109
16     123     124
19     145     150

Responder3

dadoawkcomandona verdade, faz muito perto do que você espera como saída, mas sim, divide o cabeçalho em linhas separadas por causa dos espaços (isso não será um problema se seus arquivos de entrada foram separados com Tab ou qualquer outra coisa), de qualquer forma, não entendi como o cabeçalho vai imprimir nas últimas linhas talvez awkversões diferentes tenham diferentesOrdenaçãoopção como padrão; por exemplo, PROCINFO["sorted_in"]="@val_num_desc"sua saída seria semelhante a abaixo (mas ainda não tenho ideia de como os números foram classificados em ordem asc no resultado esperado):

19 145 150
16 123 124
13 105 109
10 97 99
7 78 82
4 56 60
1 23 25
id sal sal
emp before now
----- ----- ----

vamos tentar com o comando modificado abaixo e ver se é isso que você precisa ou próximo de algo que você realmente espera:

awk '{ $2=$1"_"$2; $1=""; 
       for (i=2; i<=NF; i++) RtoC[i]= (RtoC[i]? RtoC[i] "\t" $i: $i) }
END{ PROCINFO["sorted_in"]="@unsorted";
     for (i in RtoC)  print RtoC[i];
}' emp.txt before.txt new.txt |column -t

saída:

emp_id  before_sal  now_sal
-----   -----       ----
1       23          25
4       56          60
7       78          82
10      97          99
13      105         109
16      123         124
19      145         150

informação relacionada