如果檔案是 excel 格式/csv,我們如何屏蔽數字資料
Input.xlsx/Input.csv
Col1,Col2,Col3
A,B,-98.02
M,N,1003
P,Q,-1025.345
Output.xlsx/output.csv
Col1,Col2,Col3
A,B,-78.14
M,N,1143
P,Q,-1245.745
我想將每個數值動態屏蔽為不同的值。而不是原始資料,它必須在 shell 中使用虛擬數字進行屏蔽
uj5u.com熱心網友回復:
這適用于 CSV 檔案,不適用于 xlsx 檔案:
gawk -F, 'BEGIN{ OFS=","}
{ for(i=1;i<=NF;i ){
x=$i;
gsub(/[0-9.-]*/,"",x);
if(x==""){ $i=rand()*100 }
} print $0 }' Input.csv
使用上述腳本,每個數值都替換為 0 到 100 之間的數值(帶小數)
輸出(示例):
Col1,Col2,Col3
A,B,92.4046
M,N,59.3909
P,Q,30.6394
您可以rand()*100用(幾乎)任何東西替換 以獲得另一個范圍。
for(i=1;i<=NF;i )回圈當前行中的所有欄位gsub(/[0-9.-]*/,"",x)將替換每個數字 (0-9),或.替換-為空字串 (""),當它是數字時有效地留下一個空字串。if(x=="")當x為空時,將欄位替換為隨機值。
注意:最后一塊} print $0 }'也可以寫成}}1',但我認為使用第一個選項更清楚。
編輯:保持負數為負,小數位數(大約)相同
創建一個 awk 腳本(即replace.awk):
function rep(s) {
sgn = s<0?-1:1
nbc = int(log(sgn*s)/log(10)) 1
dec = (s-int(s)==0)?0:length(sgn*s-int(sgn*s))-2
#print "DEBUG" sgn, nbc, dec, "%"nbc"."dec"f"
return sprintf("%"nbc"."dec"f",sgn*rand()*(10**nbc))
}
BEGIN{ OFS=","
srand()
}
{ for(i=1;i<=NF;i ){
x=$i;
gsub(/[0-9.-]*/,"",x);
if(x==""){ $i=rep($i) }
}
}1
并做:gawk -F, -f replace.awk Input.csv
輸出應如下所示(示例):
Col1,Col2,Col3
A,B,-49.73
M,N,5577
P,Q,-551.278
此解決方案引入的變數:
sgn數字的符號( 1 或 -1)nbc逗號前的數字(逗號 ==> 表示小數分隔符)decNumber of digits after Comma (Comma ==> meant is Decimal separator)
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/451686.html
標籤:贝壳
上一篇:在Rust中獲取系統命令的輸出
