Переформатирование строк - PullRequest
1 голос
/ 10 мая 2019

У меня есть несколько строк, которые выглядят примерно так:

[206, 40, 200] 3.588939213064659e-06
[206, 40, 58, 200] 1.0137134449402395e-05
[206, 200] 1.2268187790002155e-05
[206, 38, 200] 3.2630262623982875e-05
[206, 40, 38, 200] 3.273281423485983e-05
[206, 40, 58, 38, 200] 3.341643719910475e-05

Есть ли эффективный способ конвертировать их в следующее, используя sed / awk,

206 40 200
206 40 58 200
206 200
206 38 200
206 40 38 200 
206 40 58 38 200

и это,

206 40 200 0.000003588939213064659
206 40 58 200 0.000010137134449402395
206 200 0.000012268187790002155
206 38 200 0.000032630262623982875
206 40 38 200 0.00003273281423485983
206 40 58 38 200 0.00003341643719910475

Спасибо!

Ответы [ 3 ]

1 голос
/ 10 мая 2019

Вам просто нужен разделитель полей регулярного выражения и преобразование формата в переменную.

$ awk -F'[][, ]+' '$NF=sprintf("%.21f",$NF)' file

edit: Самый простой awk -F'[][, ]+' '{$NF=""}1'

0 голосов
/ 10 мая 2019

Отвечая на последнее требование, попробуйте:

awk '
{
    split($0, a, "] +")
    gsub("[[,]", "", a[1])
    printf("%s %.21f\n", a[1], a[2])
}' file
0 голосов
/ 10 мая 2019

Для первого вопроса попробуйте следующий.

awk 'match($0,/\[.*\]/){val=substr($0,RSTART+1,RLENGTH-2);gsub(","," ",val);print val}'  Input_file

По второму вопросу, пожалуйста, попробуйте следующее.

awk 'match($0,/\[.*\]/){val=substr($0,RSTART+1,RLENGTH-2);gsub(","," ",val);printf("%s %.21f\n",val,$NF)}'  Input_file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...