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

просто сделай:

sed 's/\(.[0-9]\+\) / /' 

он будет соответствовать только первой десятичной части и удалять ее.

на вашем образце:

echo "ENSG00000242268.2    0.07563
>  ENSG00000270112.3    0.09976
>  ENSG00000167578.15   4.38608
>  ENSG00000273842.1    0.0
>  ENSG00000078237.5    4.08856" | sed 's/\(.[0-9]\+\) / /'
ENSG00000242268    0.07563
ENSG00000270112    0.09976
ENSG00000167578   4.38608

отредактируйте, если у вас есть вкладки, попробуйте это:

sed 's/\(.[0-9]\+\)\( \|\t\)\2/' 
1
28.11.2019, 06:33
3 ответа
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
1
27.01.2020, 23:57

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

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
1
27.01.2020, 23:57

заданнаяawkкоманда на самом деле очень близка к тому, что вы ожидаете в качестве вывода, но да, разбить заголовок на отдельную строку из-за пробелов (это не будет проблемой, если ваши входные файлы были разделены Tab или что-то еще ), во всяком случае, я не понял, как заголовок будет печатать в самых последних строках, возможно, разные 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
0
27.01.2020, 23:57

Теги

Похожие вопросы