簡體   English   中英

如何通過在 AWK 中使用 sub() 刪除特定列中的雙引號

[英]How to remove double quotes in a specific column by using sub() in AWK

我的樣本數據是

cat > myfile
"a12","b112122","c12,d12"
a13,887988,c13,d13
a14,b14121,c79,d13

當我嘗試從第 2 列中刪除"

awk -F, 'BEGIN { OFS = FS } $2 ~ /"/ { sub(/"/, "", $2) }1' myfile 
"a12",b112122","c12,d12"
a13,887988,c13,d13
a14,b14121,c79,d13

它只刪除了 1 個逗號,而不是b112122我得到的是b112122"

如何刪除第二列中的所有 "

文檔

搜索目標,將其視為字符串,用於與正則表達式 regexp 匹配的最左邊最長的子字符串。[...] 返回進行的替換次數(零或一)。

很明顯,函數sub最多只進行一次替換,並且不會替換所有出現的情況。

相反,使用gsub

搜索它可以找到的所有最長的、最左邊的、不重疊的匹配子串的目標,並用替換來替換它們。 gsub() 中的“g”代表“global”,意思是到處替換。

所以你可以在你的行中添加一個“g”,它工作正常:

awk -F, 'BEGIN { OFS = FS } $2 ~ /"/ { gsub(/"/, "", $2) }1' myfile 

當您處理 CSV 文件時,不使用FPAT ,它遲早會崩潰。
這是一個執行 jib 的gnu awk

awk -v OFS="," -v FPAT="([^,]+)|(\"[^\"]+\")" '{gsub(/"/,"",$2)}1' file
"a12",b112122,"c12,d12"
a13,887988,c13,d13
a14,b14121,c79,d13

它可以在任何列上正常工作,編號 3 也是如此。

刪除第 3 列上的"同時將分隔符更改為|示例

awk -v OFS="|" -v FPAT="([^,]+)|(\"[^\"]+\")" '{gsub(/"/,"",$3);$1=$1}1' file
"a12"|"b112122"|c12,d12
a13|887988|c13|d13
a14|b14121|c79|d13

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM