Awk 使用grep-o或sed(或其他)替换除模式之间的字符
在下面的文件中,我想替换所有的Awk 使用grep-o或sed(或其他)替换除模式之间的字符,awk,sed,grep,Awk,Sed,Grep,在下面的文件中,我想替换所有的由,生成,但当有一个字符串(用两个分隔“)时,它不应替换其中的; 例如: 输入 输出 A,B,C,D 5cc0714b9b69581f14f6427f,5cc0714b9b69581f14f6428e,1,"5cc0714b9b69581f14f6427f;16a4fba8d13",xpto, 5cc0723b9b69581f14f64285,5cc0723b9b69581f14f64294,2,"5cc0723b9b69581f14f64285;16a4fbe38
代码>由,
生成,但当有一个字符串(用两个分隔“
)时,它不应替换其中的;
例如:
输入
输出
A,B,C,D
5cc0714b9b69581f14f6427f,5cc0714b9b69581f14f6428e,1,"5cc0714b9b69581f14f6427f;16a4fba8d13",xpto,
5cc0723b9b69581f14f64285,5cc0723b9b69581f14f64294,2,"5cc0723b9b69581f14f64285;16a4fbe3855",xpto,
5cc072579b69581f14f6428a,5cc072579b69581f14f64299,3,"5cc072579b69581f14f6428a;16a4fbea632",xpto,
对于sed,我有:sed's/;/,/g'input.txt>output.txt
,但这将取代一切
“
分隔字符串的正则表达式:\*;.\”
(十六进制的正则表达式更好——类似于:[0-9a-fA-F]+
)
我的问题是将所有这些结合起来,生成一个grep-o/sed,它可以替换除该模式之外的所有内容。
文件大小为两位数Gb(最大99Gb),因此
非常感谢您的任何想法。如果我正确理解您的要求,一个选择就是做一个三通的东西
从你对HEX的评论中,我会考虑到输入中没有任何类似的“x”,这样你就可以(使用GNUSED):
想法是替换代码>当被其他内容引用时,将其写入新文件,然后替换所有通过,
进行编码,然后设置代码>位于同一文件中(-i
sed标志)
这三个过程可以组合在一个命令中
sed -E 's/("[^"]+);([^"]+")/\1#\2/g;s/;/,/g;s/#/;/g' original > transformed
也就是说,可能有一堆csv解析器已经处理了引用字段,您可能可以在最终用例中使用这些字段,因为我敢打赌,这只是链中其他部分的中间步骤
From的评论:如果一次完成,可以使用\n
作为替换分隔符,因为文本中不能逐行换行。sed
用于对单个字符串执行简单的s/old/new
grep
用于执行g/re/p
。您没有尝试执行这些任务中的任何一项,因此不应该考虑这些工具中的任何一项。这就剩下了另一个用于处理文本的标准UNIX工具--awk
你有一个代码>-要生成的分隔CSV,
,
-分隔。这很简单:
$ awk -v FPAT='[^;]*|"[^"]+"' -v OFS=',' '{$1=$1}1' file
A,B,C,D
5cc0714b9b69581f14f6427f,5cc0714b9b69581f14f6428e,1,"5cc0714b9b69581f14f6427f;16a4fba8d13",xpto,
5cc0723b9b69581f14f64285,5cc0723b9b69581f14f64294,2,"5cc0723b9b69581f14f64285;16a4fbe3855",xpto,
5cc072579b69581f14f6428a,5cc072579b69581f14f64299,3,"5cc072579b69581f14f6428a;16a4fbea632",xpto,
以上使用GNU awk进行FPAT。有关使用awk解析CSV的更多详细信息,请参阅。这可能适合您(GNU-sed):
替换代码>,内有双引号和换行符,转置将“>”代码转换为“”,
”,然后将换行符转换为“”代码>。两次通过的方法是否可以接受?是。只要它能用而且速度快,我什么都拿(乞丐不能挑肥拣瘦)。考虑得很好。简单有效。谢谢我不明白你为什么不能在一次sed过程中做到这一点。@Tensibai它不起作用了。在您的第一次sed中,不会替换#。即使在末尾添加/g,也没有什么是正确的replaced@Tensibai我找到了。需要-E及其\1而不是$1<代码>sed-E的/(“[^”]+);([^“]+”/\1#\2/g”PhaseChanges_orig.csv>已转换
如果您在对sed的一次调用中就完成了这一切,那么您可以使用\n
而不是
作为临时字符,因为您知道数据中不可能有换行符(不像您希望数据中不会出现的
)。您应该提到,您的解决方案需要对其使用的各种构造使用GNU。我应该打赌您会有一种比我天真的方法更好的方法:)g/re/p
代表“全局正则表达式打印”,“全局搜索正则表达式并打印”。@JonyD yes,这是正确的-它是ed
命令行g/re/p
,其中re
表示正则表达式。
sed -E 's/("[^"]+);([^"]+")/\1#\2/g;s/;/,/g;s/#/;/g' original > transformed
$ awk -v FPAT='[^;]*|"[^"]+"' -v OFS=',' '{$1=$1}1' file
A,B,C,D
5cc0714b9b69581f14f6427f,5cc0714b9b69581f14f6428e,1,"5cc0714b9b69581f14f6427f;16a4fba8d13",xpto,
5cc0723b9b69581f14f64285,5cc0723b9b69581f14f64294,2,"5cc0723b9b69581f14f64285;16a4fbe3855",xpto,
5cc072579b69581f14f6428a,5cc072579b69581f14f64299,3,"5cc072579b69581f14f6428a;16a4fbea632",xpto,
sed -E ':a;s/^([^"]*("[^"]*"[^"]*)*"[^";]*);/\1\n/;ta;y/;/,/;y/\n/;/' file