我有這條線使用awk:
$ awk '{
for (i=1;i<=NF;i ){
if ($i 0 != $i)
$i = temp[i] 0.00
temp[i]=$i 0.00
}}1'
簡而言之,這會將每個單詞轉換為該列的最后看到的數字。
問題
問題是產生的每個值的小數位都會$i = temp[i] 0.00丟失其小數精度。
例如,
-ERROR -1.57 -2.02
-2.10 2.70 ERROR
-4.70 ERROR -0.52
-2.20 ERROR -0.02
-2.20 -1.50 ERROR
變成:
0 -1.57 -2.02
-2.10 2.70 -2.02
-4.70 2.7 -0.52
-2.20 2.7 -0.02
-2.20 -1.50 -0.02
2.70會變成2.7,所以直接跟在后面的每個詞2.70都不會變成2.70,而是變成2.7。如何強制 awk 將浮點值保存到一定數量的小數位?
顯然, 0.00沒有幫助。
uj5u.com熱心網友回復:
避免對數值進行數學運算,這反過來又會導致awk無法決定要保持多少位數的準確性;相反,只需按原樣保存每個值(有效地保存為字串)。
考慮:
$ printf "1 1.1 1.02 1.003 1.0004 1.00005\na b c d e f\n"
1 1.1 1.02 1.003 1.0004 1.00005
a b c d e f
awk對 OP 當前代碼的一些調整:
$ printf "1 1.1 1.02 1.003 1.0004 1.00005\na b c d e f\n" | awk '
{ for (i=1;i<=NF;i ){
if ($i 0 != $i)
$i = (i in temp ? temp[i] : 0)
temp[i]=$i
}
} 1'
1 1.1 1.02 1.003 1.0004 1.00005
1 1.1 1.02 1.003 1.0004 1.00005
回到 OP 的樣本資料...
向示例資料集添加更多行:
$ cat sample.dat
-ERROR -1.57 -2.02
-2.10 2.70 ERROR
-4.70 ERROR -0.52
-2.20 ERROR -0.02
-2.20 -1.50 ERROR
-3.333 0.1234 -0.02
ERROR ERROR ERROR
-2.10 2.70 ERROR
-4.70 ERROR -0.52
運行修改后的awk代碼:
awk '
{ for (i=1;i<=NF;i ){
if ($i 0 != $i)
$i = (i in temp ? temp[i] : 0)
temp[i]=$i
}
}1' sample.dat
這會產生:
0 -1.57 -2.02
-2.10 2.70 -2.02
-4.70 2.70 -0.52
-2.20 2.70 -0.02
-2.20 -1.50 -0.02
-3.333 0.1234 -0.02
-3.333 0.1234 -0.02
-2.10 2.70 -0.02
-4.70 2.70 -0.52
如果這不能解決問題,那么我們將需要查看更多能夠更準確地重現問題的示例資料。
uj5u.com熱心網友回復:
使用您顯示的示例,請嘗試以下awk代碼。
awk '
{
val=""
for(i=1;i<=NF;i ){
if(int($i)){
val=(val?val OFS:"") $i
arr[i]=$i
}
else{
val=(val?val OFS:"") (i in arr?arr[i]:0)
}
}
print val
}
' Input_file
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/430502.html
