Linux

用逗號替換下劃線並刪除 CSV 中的雙引號

  • March 2, 2022

我有一個 CSV 文件

input.csv

"1_1_0_0_76"
"1_1_0_0_77"
"1_1_0_0_78"
"1_1_0_0_79"
"1_1_0_0_80"
"1_1_0_0_81"
"1_1_0_0_82"
"1_1_0_0_83"
"1_1_0_0_84"
"1_1_0_0_85"

…………. 等等。

我需要將此 CSV 文件轉換為

result.csv 

1,1,0,0,76
1,1,0,0,77
1,1,0,0,78
1,1,0,0,79
1,1,0,0,80
1,1,0,0,81
1,1,0,0,82
1,1,0,0,83
1,1,0,0,84
1,1,0,0,85

更簡單的方法是使用tr

$ tr '_' ',' < input.csv | tr -d '"'                  
1,1,0,0,76
1,1,0,0,77
1,1,0,0,78

其工作方式是tr採用兩個參數 - 要替換的字元集及其替換。在這種情況下,我們只有 1 個字元的集合。我們通過 shell 操作符重定向input.csvinputtr的 stdin 流<,並將結果輸出通過管道傳遞tr -d '"'給刪除雙引號。

awk也能做到。

$ cat input.csv
"1_1_0_0_76"
"1_1_0_0_77"
"1_1_0_0_78"
$ awk '{gsub(/_/,",");gsub(/"/,"")};1' input.csv
1,1,0,0,76
1,1,0,0,77
1,1,0,0,78

它的工作方式略有不同:awk 逐行讀取每個文件,每個內聯腳本都是/Pattern match/{ codeblock}/Another pattern/{code block for this pattern}. 這裡我們沒有模式,所以它意味著為每一行執行程式碼塊。gsub()函式用於行內的全域替換,因此我們用它來用逗號替換下劃線,用空字元串替換雙引號(有效地刪除字元)。1代替缺少程式碼塊的模式匹配,預設情況下僅列印該行;換句話說,程式碼塊gsub()完成工作並1列印結果。

使用 shell 重定向 ( >) 將輸出發送到新文件:

awk '{gsub(/_/,",");gsub(/"/,"")};1' input.csv > output.csv

引用自:https://unix.stackexchange.com/questions/338510