2016-04-13 24 views
-1

Girdi:Nasıl arama ve unix içinde "" arasındaki yerini almak üzere

20000000,"xxxxxxxxxxxxx,xxxxxxxxxxx",192.168.3.2 
Exchange subsidary,Passed,00021423SNG,R-JAM-05-03,US (First Exchange),20000000,"JUDICIARY, STATE COURTS (STATE COURTS)",112.78.212.12/30,00052312SNG,R-JPODIU-023-07,US (First Exchange) ,20000000,"JUDICIARY, STATE COURTS (STATE COURTS)",112.78.224.213/30 

İdeal sonucu: Ben tırnak arasına virgül kurtulmak nasıl

20000000,"xxxxxxxxxxxxxxxxxxxxxxxx",192.168.3.2  
Exchange subsidary,Passed,00021423SNG,R-JAM-05-03,US (First Exchange),20000000,"JUDICIARY STATE COURTS (STATE COURTS)",112.78.212.12/30,00052312SNG,R-JPODIU-023-07,US (First Exchange) ,20000000,"JUDICIARY STATE COURTS (STATE COURTS)",112.78.224.213/30 

? Ayrıca tırnak işaretleri arasında virgül olmayan çizgiler de vardır.

İç virgülü "JUDICIARY, STATE COURTS (STATE COURTS)" (her iki örnekte de tek bir satıra) kaldırmam gerekiyor. karşılama goto dünyasına sed yılında -

Ve some lines Burada bunu nasıl tanıtıyor bir senaryo çift

+1

StackOverflow'a Hoş Geldiniz. Size yardımcı olacak daha fazla bilgiye ihtiyacımız olacak. Bu veriler bir dosyada, veritabanında, çevrimiçi kaynakta mı yoksa ne? Şimdiye kadar ne denediniz? – bitfiddler

+0

o "xxxx, xxxx" 7 ve 8 alanındadır ve ayırıcı olarak "," kullanıyor. İstediğim şey, eğer mevcutsa ve tüm bilgiler bir txt dosyasında saklanıyorsa, tırnak içindeki virgülü kaldırmaktır. –

+0

kaldırın ya da ikisini de değiştirin. Sadece "" içindekiler teşekkürler. –

cevap

1

arasındaki virgül ile çeşitli alanları vardır. Bu, uzatılmış düzenli ifadeleri etkinleştirmek için -E kullanan BSD sed kullanılarak yazılmıştır; GNU sed, aynı görev için -r kullanır.

sed -E -e 's/^/A: /p; s/^A: /B: /' \ 
     -e ':again' \ 
     -e 's/^(([^"]*|"[^",]*")*)("[^"]*),([^"]*")/\1\3\4/' \ 
     -e 't again' \ 
     data 

veri data adlı bir dosyada olduğunu varsayarsak. İlk -e sadece A: ile önceden girilen orijinal girişi eker ve önekini B: olarak değiştirir. Bu, hata ayıklama malzemesidir. İkinci -e, atlamanın mümkün olduğu bir etiket again yapar. Önceki adım bir değişiklik yaptıysa dördüncü -e, again etiketine atlar.

Tüm heyecan üçüncü -e. Desen, satırın başlangıcını arar, ardından "çift tırnak işareti değil" veya "çift tırnak işareti ve ardından çift tırnak işareti değil, çift tırnak işareti ve çift tırnak işareti" sırasının sıfır veya daha fazla yinelemesi dizisi izler. bir çift alıntı, 'çift tırnak değil, bir virgül, daha' çift tırnak değil 've bir çift tırnak dizisi. Bu, önek, çift tırnak ve çift tırnak arasındaki virgül sonrası bölüm arasındaki virgülden önceki kısım ile değiştirilir.

bir veri dosyası Verilen:

2000,"xxxx,xxxx",192.168.3.2 
2000,"xx,xx,xx",192.16.3.2 
2000,"xxxxxxxx",192.168.3.2 
20000000,"xxxxxxxxxxxx,xxxxxxxxxxxx",192.168.3.2,"yyyyy,yyyyy" 
20000000,"xxxxxxxxxxxxx,xxxxxxxxxxx",192.168.3.2 
20000000,"xxxxxxxxxxxxxxxxxxxxxxxx",192.168.3.2 
201,"x,x",192.168.3.2,"y,y","aaaa,cccc,dddd",192,"zzzz",234 
201,"x,x",192.168.3.2,"yyy" 
201,"xx",192.168.3.2,"yyy",2211 
201,"xxx",192.168.3.2,"y,y" 
201,"xxx",192.168.3.2,"yyy" 
201,"x,x",192.168.3.2,"y,y" 
Exchange subsidary,Passed,00021423SNG,R-JAM-05-03,US (First Exchange),20000000,"JUDICIARY, STATE COURTS (STATE COURTS)",112.78.212.12/30,00052312SNG,R-JPODIU-023-07,US (First Exchange) ,20000000,"JUDICIARY, STATE COURTS (STATE COURTS)",112.78.224.213/30 

komut çıktı üretir:

A: 2000,"xxxx,xxxx",192.168.3.2 
B: 2000,"xxxxxxxx",192.168.3.2 
A: 2000,"xx,xx,xx",192.16.3.2 
B: 2000,"xxxxxx",192.16.3.2 
A: 2000,"xxxxxxxx",192.168.3.2 
B: 2000,"xxxxxxxx",192.168.3.2 
A: 20000000,"xxxxxxxxxxxx,xxxxxxxxxxxx",192.168.3.2,"yyyyy,yyyyy" 
B: 20000000,"xxxxxxxxxxxxxxxxxxxxxxxx",192.168.3.2,"yyyyyyyyyy" 
A: 20000000,"xxxxxxxxxxxxx,xxxxxxxxxxx",192.168.3.2 
B: 20000000,"xxxxxxxxxxxxxxxxxxxxxxxx",192.168.3.2 
A: 20000000,"xxxxxxxxxxxxxxxxxxxxxxxx",192.168.3.2 
B: 20000000,"xxxxxxxxxxxxxxxxxxxxxxxx",192.168.3.2 
A: 201,"x,x",192.168.3.2,"y,y","aaaa,cccc,dddd",192,"zzzz",234 
B: 201,"xx",192.168.3.2,"yy","aaaaccccdddd",192,"zzzz",234 
A: 201,"x,x",192.168.3.2,"yyy" 
B: 201,"xx",192.168.3.2,"yyy" 
A: 201,"xx",192.168.3.2,"yyy",2211 
B: 201,"xx",192.168.3.2,"yyy",2211 
A: 201,"xxx",192.168.3.2,"y,y" 
B: 201,"xxx",192.168.3.2,"yy" 
A: 201,"xxx",192.168.3.2,"yyy" 
B: 201,"xxx",192.168.3.2,"yyy" 
A: 201,"x,x",192.168.3.2,"y,y" 
B: 201,"xx",192.168.3.2,"yy" 
A: Exchange subsidary,Passed,00021423SNG,R-JAM-05-03,US (First Exchange),20000000,"JUDICIARY, STATE COURTS (STATE COURTS)",112.78.212.12/30,00052312SNG,R-JPODIU-023-07,US (First Exchange) ,20000000,"JUDICIARY, STATE COURTS (STATE COURTS)",112.78.224.213/30 
B: Exchange subsidary,Passed,00021423SNG,R-JAM-05-03,US (First Exchange),20000000,"JUDICIARY STATE COURTS (STATE COURTS)",112.78.212.12/30,00052312SNG,R-JPODIU-023-07,US (First Exchange) ,20000000,"JUDICIARY STATE COURTS (STATE COURTS)",112.78.224.213/30 

unutmayın: Bu çok zor. Bir seçeneğiniz varsa CSV formatlamadan haberdar olan bir araç kullanın. Örneğin, Python bir CSV modülü ile birlikte gelir; Perl, bunun üstesinden gelebilecek Text::CSV (ve yan modüller Text::CSV_PP ve Text::CSV_XS) sahiptir; CSV dosyalarını değiştirmek için özel araçlar var. Microsoft'un, Microsoft'un kullandığı şeyi (ilk bir yaklaşıma göre) rasyonelleştirme girişimi olan RFC 4180'dan biraz farklı notasyonlar desteklediğini unutmayın.

+1

Her zaman olduğu gibi mükemmel bir gönderi. Doğru araçları kullanma konusunda katılıyorum. O.P.Ayrıca, doğru şekilde biçimlendirilmiş verileri yeniden oluşturmayı denemenizi öneririz. Çoğu zaman bu en hızlı çözümdür. Hepinize iyi şanslar. – shellter

+0

Yardım için teşekkürler –