2017-06-13 39 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}