![Транспонировать строки в столбцы в правильном формате.](https://rvso.com/image/164728/%D0%A2%D1%80%D0%B0%D0%BD%D1%81%D0%BF%D0%BE%D0%BD%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%B8%20%D0%B2%20%D1%81%D1%82%D0%BE%D0%BB%D0%B1%D1%86%D1%8B%20%D0%B2%20%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC%20%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%82%D0%B5..png)
У меня есть 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