Транспонировать строки в столбцы в правильном формате.

Транспонировать строки в столбцы в правильном формате.

У меня есть 3 текстовых файлаemp id.txt, раньше sal.txt, теперь sal.txt. Содержимое этих 3 файлов:-

emp идентификатор.txt

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

перед sal.txt

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

теперь сал

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

Я использовал ниже в скрипте оболочки

awk '{ for (i=1; i<=NF; i++) RtoC[i]= (RtoC[i]? RtoC[i] FS $i: $i) } END{ for (i in RtoC) print RtoC[i] }' для преобразования из строки в столбец я получил вывод вроде -

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

Но мне нужен вывод в следующем формате:

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

Не могли бы вы мне помочь, чтобы я мог получить вывод в указанном выше формате?

решение1

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

выход

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

решение2

Определим небольшую функцию, которая преобразует файл в столбец:

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

затем используйте pasteдля сшивания столбиков вместе,замена процессав качестве аргументов файла для вставки и columnдля красивого вывода.

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

решение3

данныйawkкомандана самом деле делает очень близко к тому, что вы ожидаете в качестве вывода, но да, разбейте заголовок на отдельные строки из-за пробелов (это не будет проблемой, если ваши входные файлы были разделены табуляцией или чем-то еще), в любом случае я не понял, как заголовок будет печататься в самых последних строках, возможно, в разных awkверсиях было по-разномусортировкавариант по умолчанию; например, PROCINFO["sorted_in"]="@val_num_desc"ваш вывод будет похож на приведенный ниже (но все еще не имею представления о том, как числа сортируются по возрастанию в ожидаемом результате):

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

Давайте попробуем с измененной командой ниже и посмотрим, то ли это, что вам нужно, или близко к тому, что вы действительно ожидаете:

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

выход:

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

Связанный контент