Разделить все столбцы на первый столбец - PullRequest
2 голосов
/ 01 октября 2019

У меня есть файл с разделителями табуляции

1A      865     508     512     146     139     499     504     541     539     8       11      62      67      1       1       1       1       30      40      4       3       0       2       0       0   0 0
1B      34      12      12      2       5       12      14      19      18      1       1       2       0       0       0       0       0       1       1       0       0       0       0       0       0   0 0

Мне нужно разделить каждый столбец с col3 на col2 и умножить полученную строку на 100 (от округления до 2 десятичных знаков) на строку

Так что у меня есть

1A  865 58.73  59.19  16.88  16.07  57.69  58.27  62.54  62.31  0.92  1.27  7.17   7.75   0.12  0.12  0.12  0.12  3.47  4.62  0.46  0.35  0.00  0.23  0.00  0.00  0.00  0.00
1B  34 35.29  35.29  5.88   14.71  35.29  41.18  55.88  52.94  2.94  2.94  5.88   0.00   0.00  0.00  0.00  0.00  2.94  2.94  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00

Я делаю

awk 'BEGIN {FS=OFS="\t"} {for (i=3; i<=NF; i++) printf "%.2f\t",($i/=$2)*100;}1'

но я получаю

58.73  59.19  16.88  16.07  57.69  58.27  62.54  62.31  0.92  1.27  7.17   7.75   0.12  0.12  0.12  0.12  3.47  4.62  0.46  0.35  0.00  0.23  0.00  0.00  0.00  0.00  1A  865   0.587283  0.591908  0.168786   0.160694  0.576879  0.582659  0.625434  0.623121  0.00924855  0.0127168   0.0716763  0.0774566  0.00115607   0.00115607   0.00115607  0.00115607  0.0346821  0.0462428  0.00462428  0.00346821   0           0.00231214  0           0           0            0
35.29  35.29  5.88   14.71  35.29  41.18  55.88  52.94  2.94  2.94  5.88   0.00   0.00  0.00  0.00  0.00  2.94  2.94  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  1B  34    0.352941  0.352941  0.0588235  0.147059  0.352941  0.411765  0.558824  0.529412  0.0294118   0.0294118   0.0588235  0          0            0            0           0           0.0294118  0.0294118  0           0            0           0           0           0           0            0

1 Ответ

3 голосов
/ 01 октября 2019

С awk:

awk 'BEGIN{FS=OFS="\t"}{for(i=3;i<=NF;i++) $i=sprintf("%.2f",$i/$2*100)}1' file

Вывод:

1A      865     58.73   59.19   16.88   16.07   57.69   58.27   62.54   62.31   0.92    1.27    7.17    7.75       0.12    0.12    0.12    0.12    3.47    4.62    0.46    0.35    0.00    0.23    0.00    0.00    0.00       0.00
1B      34      35.29   35.29   5.88    14.71   35.29   41.18   55.88   52.94   2.94    2.94    5.88    0.00       0.00    0.00    0.00    0.00    2.94    2.94    0.00    0.00    0.00    0.00    0.00    0.00    0.00       0.00
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...