我需要驗證和清理 CSV 中的欄位。有一列 IP 地址,我只需要洗掉該列內的無效資料。
我嘗試了以下命令:
awk 'BEGIN{ FS=OFS="," }{ gsub(/^([0-9]{1,3}[\.]){3}[0-9]{1,3}$/,"", $3) }1' input.csv
輸入檔案
anna,new york,192.168.1.5,usa
james,denver,240.210.1.8,usa
peter,denver,colarado,usa
tommy,new york,10.2.8.3 male,usa
電流輸出
anna,new york,,usa
james,denver,,usa
peter,denver,colarado,usa
tommy,new york,10.2.8.3 male,usa
預期產出
anna,new york,192.168.1.5,usa
james,denver,240.210.1.8,usa
peter,denver,,usa
tommy,new york,10.2.8.3,usa
此命令洗掉匹配的資料,但我需要相反的。如何僅洗掉 IP 列中的不匹配資料?
uj5u.com熱心網友回復:
如何僅洗掉 IP 列中的不匹配資料?
您可以組合以下字串函式:match substr對于此任務,請遵循以下方式
anna,new york,192.168.1.5,usa
james,denver,240.210.1.8,usa
peter,denver,colarado,usa
tommy,new york,10.2.8.3 male,usa
然后
awk 'BEGIN{FS=OFS=","}{$3=match($3,/([0-9]{1,3}[\.]){3}[0-9]{1,3}/)?substr($3,RSTART,RLENGTH):"";print}' file.txt
給出輸出
anna,new york,192.168.1.5,usa
james,denver,240.210.1.8,usa
peter,denver,,usa
tommy,new york,10.2.8.3,usa
說明:我通知 GNUAWK既是,欄位分隔符(FS)又是輸出欄位分隔符(OFS),然后對于每一行我使用所謂的三元運算子條件?valueiftrue :valueiffalse,條件是 if$3匹配正則運算式,觀察我稍微改變了它,所以它如果 IP 在內部某個地方,而不是跨越整個列,則確實成立。如果找到匹配,我會使用substr匹配 using 來獲取與 match 相對應的子字串,這些子字串RSTART由RLENGTHmatch 設定,否則我使用空字串。之后我print整行。
(在 gawk 4.2.1 中測驗)
uj5u.com熱心網友回復:
使用sed(如果它是一個有效的選項)
$ sed -E 's/(([^,]*,){2}[0-9.]*)[[:alpha:] ] ,/\1,/' input_file
anna,new york,192.168.1.5,usa
james,denver,240.210.1.8,usa
peter,denver,,usa
tommy,new york,10.2.8.3,usa
uj5u.com熱心網友回復:
如果您的 CSV 與您顯示的一樣簡單(每條記錄一行,欄位內沒有逗號,欄位內沒有引號,欄位中沒有前導或尾隨空格...),并且在洗掉malein之后10.2.8.3 male(是錯字嗎?),你可以試試:
$ awk -F, -v OFS=, '$3 !~ /^([0-9]{1,3}\.){3}[0-9]{1,3}$/ {$3 = ""} {print}' input.csv
anna,new york,192.168.1.5,usa
james,denver,240.210.1.8,usa
peter,denver,,usa
tommy,new york,10.2.8.3,usa
如果您想檢查第三個欄位是否真的是一個有效的完整 IP 地址(無子網):
$ cat filter.awk
function isIP(v) {
if(v !~ /^([0-9]{1,3}\.){3}[0-9]{1,3}$/)
return 0;
split(v, a, /\./)
for(i = 1; i <= 4 ; i ) {
if(a[i] > 255) {
return 0;
}
}
return 1
}
BEGIN { FS = ","; OFS = "," }
! isIP($3) {$3 = ""}
{print}
$ cat input.csv
bob,LA,292.168.1.5,usa
anna,new york,192.168.1.5,usa
james,denver,240.210.1.8,usa
peter,denver,colarado,usa
tommy,new york,10.2.8.3,usa
$ awk -f filter.awk input.csv
bob,LA,,usa
anna,new york,192.168.1.5,usa
james,denver,240.210.1.8,usa
peter,denver,,usa
tommy,new york,10.2.8.3,usa
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/531754.html
上一篇:用sed替換一些textr
