在我的檔案的一個明確的特定行上,例如第 93 行,我有一個在 [0.0, 1.0) 范圍內的 3 個分量的坐標。我想將第一個和第二個數字相加 0.5 或 -0.5,使其仍在 [0.0, 1.0) 范圍內,同時保持第三個數字不變。我怎樣才能撰寫一個腳本來通過sed或awk其他任何方式來做到這一點?有一批檔案需要處理,非常感謝幫助。
輸入:
...
0.6004778515530910 0.3354932652277851 0.0828914297825582
...
輸出:
...
0.1004778515530910 0.8354932652277851 0.0828914297825582
...
ps:還有一個特點是第一個數字的第十位永遠是字串的第5位(前面有兩個空格),第二位永遠是第25位。我不確定這是否會使任務更容易。
uj5u.com熱心網友回復:
echo ' 0.6004778515530910 0.3354932652277851 0.0828914297825582' |
mawk '$!NF=sprintf("\n\t%s\n\t%.*s%.f%.*s%d%s", $(_<_), _ =_ =_^=_<_,$!_,( _ substr($!_,_,!!_)) %(_ _),_*_- _, substr($!_,_),(substr($!_,--_*_,!!_) _) %(_ _), substr($!_,_*_ (_^=!_)))'
0.6004778515530910 0.3354932652277851 0.0828914297825582
0.1004778515530910 0.8354932652277851 0.0828914297825582
uj5u.com熱心網友回復:
使用 GNU awk:
$ awk -v CONVFMT='%.16f' '{$1 =($1<0.5)?0.5:-0.5; $2 =($2<0.5)?0.5:-0.5; print}' file
0.1004778515530910 0.8354932652277851 0.0828914297825582
解釋:CONVFMTGNUawk變數指定數字的轉換格式;%.16f表示基數字符后的 16 位數字。
$1 =($1<0.5)?0.5:-0.5將0.5小于 的第一個欄位添加到0.5,否則減去0.5。$2 =($2<0.5)?0.5:-0.5對第二個欄位做同樣的事情。并print列印修改后的記錄。
如果您想保留 2 個前導空格,請使用print " " $0,而不僅僅是print:
$ awk -v CONVFMT='%.16f' '{$1 =($1<0.5)?0.5:-0.5; $2 =($2<0.5)?0.5:-0.5; print " " $0}' foo.txt
0.1004778515530910 0.8354932652277851 0.0828914297825582
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/517581.html
標籤:重击
下一篇:避免在嵌套選擇中持續提示
