2016-11-09 108 views
1

我有一个像下面更换使用awk图案或sed的

12345343|559|-2,0,-200000,-20|20161108000000|FL|62,859,1439,1956|0,0,21300,0|S 
3434344|-100000|20161108000000|GL|135|0|S 
45454545|214|-2000,-2,0,0,-20|20161108000001||21,62,859,969,1956|77440,0,0,0,0|S 

在这里,我需要更换所有的,值,并获得在子的第一个值设置

有图案文件

需要的输出:

12345343|559|-2|20161108000000|FL|62|0|S 
3434344|-100000|20161108000000|GL|135|0|S 
45454545|214|-200000|20161108000001||21|77440|S 

我已经试过sed 's/\,*|//'但没有工作

+0

欢迎堆栈溢出!当问题陈述简单地说,“它不起作用”时,很难提供解决方案。请[编辑]您的问题,以更全面地描述您预期会发生什么以及与实际结果有何不同。看[问]提示什么是一个很好的解释。 –

+1

看起来你打算写',[^ |] *'而不是'\,* |'? –

回答

4

好,最简单的话题:

$ sed 's/,[^|]*//g' ip.txt 
12345343|559|-2|20161108000000|FL|62|0|S 
3434344|-100000|20161108000000|GL|135|0|S 
45454545|214|-2000|20161108000001||21|77440|S 

只需更换,其次是非|字符没有


同样的,perl

$ perl -pe 's/,[^|]*//g' ip.txt 
12345343|559|-2|20161108000000|FL|62|0|S 
3434344|-100000|20161108000000|GL|135|0|S 
45454545|214|-2000|20161108000001||21|77440|S 


随着awk,礼貌@JamesBrown

$ awk '{gsub(/,[^|]*/,"")} 1' ip.txt 
12345343|559|-2|20161108000000|FL|62|0|S 
3434344|-100000|20161108000000|GL|135|0|S 
45454545|214|-2000|20161108000001||21|77440|S 

$ awk 'gsub(/,[^|]*/,"")+1' ip.txt 
12345343|559|-2|20161108000000|FL|62|0|S 
3434344|-100000|20161108000000|GL|135|0|S 
45454545|214|-2000|20161108000001||21|77440|S 
+0

好的sed命令。我在想太复杂了 – hek2mgl

+0

我一开始想的太复杂了..分裂成领域,捕获等'perl -F'\'' -lane's /([^,]*),.*/$ 1/foreach @F;打印加入“|”,@ F'' – Sundeep

+1

我喜欢+1顺便说一句。 –

2

这里有一个方法来完成它:

awk 'BEGIN{FS=OFS="|"} {i=0; while(++i<=NF) gsub(/,.*/,"",$i)}1' File 

输出:

12345343|559|-2|20161108000000|FL|62|0|S 
3434344|-100000|20161108000000|GL|135|0|S 
45454545|214|-2000|20161108000001||21|77440|S 
+0

1在陈述结尾处做了什么? – dood

+0

打印记录(在这种情况下的每一行)没有它的只有替换会发生,但没有打印。 –

+0

这个数字实际上是什么意思?我试着用2和3,输出是一样的。不会打印$ 0更可读? – dood