需要一些解決方案在 CSV 檔案的特定列中用逗號替換管道,它也有一些鍵值作為管道分隔的字串(可以是任意數量,一個或多個)。
基本上需要替換不在大括號內的管道,即{subStringX441|subStringX442|subStringX443|subStringX444} 應該保持不變。
不能使用 simple sed -i -e 's\|\,\g' filename,因為它將替換所有管道。
輸入:
column1,column2,column3,column4,column5,column6,column7
stringX1,stringX2,stringX3,stringX41|stringX42|stringX43|stringX44={subStringX441|subStringX442|subStringX443|subStringX444}|stringX45,stringX5,stringX6,stringX7
stringY1,stringY2,stringY3,stringY41|stringY42|stringY43|stringY44={subStringY441|subStringY442|subStringY443}|stringY45,stringY5,stringY6,stringY7
期望輸出:
column1,column2,column3,column4a,column4b,column4c,column4d,column4e,column5,column6,column7
stringX1,stringX2,stringX3,stringX41,stringX42,stringX43,stringX44={subStringX441|subStringX442|subStringX443|subStringX444},stringX45,stringX5,stringX6,stringX7
stringY1,stringY2,stringY3,stringY41,stringY42,stringY43,stringY44={subStringY441|subStringY442|subStringY443},stringY45,stringY5,stringY6,stringY7
uj5u.com熱心網友回復:
使用 sed
$ sed 's/\({[^}]*\)\||/,\1/g;s/,{/{/;1s/column4/&a,&b,&c,&d,&e/' input_file
column1,column2,column3,column4a,column4b,column4c,column4d,column4e,column5,column6,column7
stringX1,stringX2,stringX3,stringX41,stringX42,stringX43,stringX44={subStringX441|subStringX442|subStringX443|subStringX444},stringX45,stringX5,stringX6,stringX7
stringY1,stringY2,stringY3,stringY41,stringY42,stringY43,stringY44={subStringY441|subStringY442|subStringY443},stringY45,stringY5,stringY6,stringY7
uj5u.com熱心網友回復:
正則運算式(嚴格意義上)不足以處理平衡括號(最后意味著至少 Chomsky Type-2)。我將AWK按照以下方式使用 GNU完成此任務,讓file.txt內容成為
stringY1,stringY2,stringY3,stringY41|stringY42|stringY43|stringY44
{subStringY441|subStringY442|subStringY443}|stringY45,stringY5,stringY6,stringY7
然后
awk 'BEGIN{FPAT=".";OFS=""}{for(i=1;i<=NF;i =1){if($i=="{"){inside=1};if($i=="}"){inside=0};if(!inside && $i=="|"){$i=","}};print}' file.txt
輸出
stringY1,stringY2,stringY3,stringY41,stringY42,stringY43,stringY44
{subStringY441|subStringY442|subStringY443},stringY45,stringY5,stringY6,stringY7
說明:我通知 GNUAWK任何單個字符都將被視為使用FPAT變數的欄位,而輸出欄位分隔符是使用OFS變數的空字串。對于我使用for回圈遍歷后續欄位(即字符)的每一行,如果字符是,{則將變數設定inside為1,如果字符是,}則將變數設定為0,然后如果我們不在 ( !) 內部并且 ( &&) 字符|將其更改為,. 處理完 I 行中的所有字符后print。
免責宣告此解決方案假定大括號永遠不會嵌套,并且每個{都}在給定行中匹配。
(在 gawk 4.2.1 中測驗)
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/387461.html
下一篇:洗掉空檔案-提高邏輯性能
