2014-03-05 172 views
0

我想從csv文件中刪除兩行之間的字符串。這裏是我的示例文件:刪除字符串之間的兩個符號之間的字符串

1.1.1.1,A-B:,awef.C.D.E 
1.1.1.2,A-B:,few.C.D.E 
1.1.1.3,A-B:,dfs.C.D 
1.1.1.4,A-B:,few.C.D 
1.1.1.5,A-B:,fdsferger.C.D.E 
1.1.1.6,A-B:,wef.C.D 
1.1.1.7,A-B:,jty.C.D.E 

輸出會是這樣的:

1.1.1.1,A-B:,C.D.E 
1.1.1.2,A-B:,C.D.E 
1.1.1.3,A-B:,C.D 
1.1.1.4,A-B:,C.D 
1.1.1.5,A-B:,C.D.E 
1.1.1.6,A-B:,C.D 
1.1.1.7,A-B:,C.D.E 

什麼辦法可以實現呢?

回答

3

以下awk命令可以做到這一點:

awk 'BEGIN{FS=OFS=","}{sub("[^.]*.","",$3);print}' 

它基本上將每個線成三個逗號分隔的字段然後刪除第三字段的初始部分,直到幷包括第一.字符。

然後它再次輸出它們。

請參見下面的成績單了示範:

pax> echo '1.1.1.1,A-B:,awef.C.D.E 
1.1.1.2,A-B:,few.C.D.E 
1.1.1.3,A-B:,dfs.C.D 
1.1.1.4,A-B:,few.C.D 
1.1.1.5,A-B:,fdsferger.C.D.E 
1.1.1.6,A-B:,wef.C.D 
1.1.1.7,A-B:,jty.C.D.E' | awk 'BEGIN{FS=OFS=","}{sub("[^.]*.","",$3);print}' 

1.1.1.1,A-B:,C.D.E 
1.1.1.2,A-B:,C.D.E 
1.1.1.3,A-B:,C.D 
1.1.1.4,A-B:,C.D 
1.1.1.5,A-B:,C.D.E 
1.1.1.6,A-B:,C.D 
1.1.1.7,A-B:,C.D.E 
+0

+1:可縮短至'AWK「BEGIN {FS = OFS = 「」} {子(/[^.]+./,"",$ 3)} 1' file' –

+0

@paxdiablo謝謝,那是很快的迴應:D。還要了解更多關於awk命令的內容 – Tazugan

+1

@jaypal:感謝您的建議。我已經使用了FS /子版本,但是我更喜歡'print'的可讀性比奇怪的awk'1'風格:-) – paxdiablo

1

您可以使用SED也

sed -r 's/(.*:,)([a-z]*.)(.*)/\1\3/g' 

(or) 

sed -r 's/:,[^.]+\./:,/' file 
+1

或'sed -r's /:,[^.]+\./:,/'file' –

+0

@jaypal,謝謝你的建議。 – Kalanidhi

2

這裏是一個awk應該做的:

awk '{sub(/:,[^.]*\./,":,")}1' file 
1.1.1.1,A-B:,C.D.E 
1.1.1.2,A-B:,C.D.E 
1.1.1.3,A-B:,C.D 
1.1.1.4,A-B:,C.D 
1.1.1.5,A-B:,C.D.E 
1.1.1.6,A-B:,C.D 
1.1.1.7,A-B:,C.D.E 
+1

'sed'默認支持'BRE',因此使用'-r'開關打開'ERE'。 'awk'默認支持'ERE',所以'+'可以正常工作。 –

+0

如果你有一個輸入行,如:'1.1.1.7,A-B:,C.D.E',它將變成'1.1.1.7,A-B :, C.D.E'帶'+',所以'*'可以。 – Jotne

+0

不知道我是否按照?你會如何得到這個輸出? –

1

這可能會爲工作你(GNU sed):

sed 's/^\(.*,\)[^.]*\./\1/' file 

使用貪婪收集除最後一列以外的所有列,然後刪除幷包括第一個.

相關問題