2017-06-13 73 views
1

考慮這個來源:AWK - 具有領域相同的字符分隔符解析文本

field1;field2;"data;data field3";field4;"data;data field5";field6 
field1;"data;data field2";field3;field4;field5;"data;data field6" 

正如你可以看到,字段分隔符正在某些領域內使用,"之間封閉。我不能直接用awk解析,因爲沒有辦法避免不必要的分裂,至少我沒有找到辦法。此外,這些特殊領域的行內可變位置,他們可以發生一次,兩次,4次等。

我想到了一個解決方案,涉及預解析步驟,在那裏我用這些字段替換;某種形式的代碼。問題是sed/awk執行貪婪REGEX匹配。所以在上面的例子中,我只能在每行中用引號引起來的最後一個字段中替換;

如何匹配每個引號的實例並替換其中的特定;?我不想用perlpython

+1

它是什麼,你想一次喲做分號你把田地分開了嗎?爲什麼你不想使用'perl'?它只是另一個像'awk'這樣的工具,可以在命令行中使用......通過'GNU awk'你可以使用https://www.gnu.org/software/gawk/manual/html_node/Splitting-By-Content .html#按內容分割 – Sundeep

回答

3

使用gnu awk您可以使用特殊FPAT變量來爲您的領域正則表達式。

您可以使用此命令通過|全部更換;雙引號中:

awk -v OFS=';' -v FPAT='"[^"]*"|[^;]*' '{for (i=1; i<=NF; i++) gsub(/;/, "|", $i)} 1' file 

field1;field2;"data|data field3";field4;"data|data field5";field6 
field1;"data|data field2";field3;field4;field5;"data|data field6" 
+1

我不知道'FPAT'是通過它們而不是它們不是什麼的方式定義字段的方式,就像通常使用的'-F'一樣。這真棒,我實際上可以使用這種方法直接解析我的源代碼。謝謝! –

2

作爲一種替代FPAT可以設置awkFS是雙引號,然後換出你的分號分隔符所有其他領域:

awk -F"\"" '{for(i=1;i<=NF;++i){ if(i%2==0) gsub(/;/, "|", $i)}} {print $0}' yourfile 

這裏AWK是:

  1. 分裂由雙引號記錄(-F"\""
  2. 通過它找到的每個字段循環({for(i=1;i<=NF;++i)
  3. 測試領域有序的模2,如果是0(if(i%2==0)
  4. 如果它甚至然後交換出與管道(gsub(/;/, "|", $i)
  5. 打印出轉化記錄({print $0}