2016-11-09 95 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