Bu dosyayı düzeltmek için sed komutu nedir, bu yüzden her satırdaki son değer iki katıdır.


6

İki milyon satırlık form içeren bir dosyam var:

"00005cea-668e-4475-9e19-92a25c8b74fb",129.24728",D#

Son değer aslında olmalı:

"00005cea-668e-4475-9e19-92a25c8b74fb",129.24728,"D#"

Lütfen, bu dosyayı düzeltmek için sed komutunu nasıl kullanırım, böylece sahte "kaldırılır ve son değer iki kez gösterilir.


1
Bu 129.24728"doğru mu yoksa yazım hatası mı?
AB

@ AB kaldırılacak.
muru

1
Silmek yerine neden çift gibi alıntı "00005cea-668e-4475-9e19-92a25c8b74fb","129.24728","D#"
yapmazsınız

@snoop çünkü onun sayısal bir değeri, db içine alınacak bir csv dosyası
Paul Taylor

Yanıtlar:


5

Gibi bir şey deneyebilirsiniz:

sed -r 's/",([^,]*)$/,"\1"/' input-file

Bunu , dosyanın sonuna kadar ",virgül ( [^,]) olmayan bir şey izler $. \1parantez içinde eşleşen kısımdır - ([^,]*).


Harika, bu en basit çözümü aradı ve kusursuz çalıştı
Paul Taylor

3

Değil sed, ama perl:

perl -F, -ane '($f1)=$F[1]=~/(.*)"/; $F[2]=~s/\n//g; print "$F[0],$f1,\"$F[2]\"\n";'

Açıklama:

  • perl -F, -ane giriş satırındaki bilgiyi okur ve çizgiyi a ,
  • ($f1)=$F[1]=~/(.*)"/;"ikinci sütunda kaldırır
  • $F[2]=~s/\n//g; sonunda yeni satırı kaldırır
  • print "$F[0],$f1,\"$F[2]\"\n";çıktıyı yazar ve "son değere ekler

Düzenleme - kısaltılmış Versiyon (@kos sayesinde):

perl -F, -lane '$F[1]=~s/"$//; print "$F[0],$F[1],\"$F[2]\"";'

3

Alanlarınız virgüllerle tanımlanmış gibi görünüyor. Eğer öyleyse, bunu içinde yapabilirsiniz sed:

sed -i -r 's/",([^,]*)$/,"\1"/' file

Veya, Perl'de:

perl  -i -lpe 's/",([^,]*)$/,"\1"/' file

Her iki durumda da, regex sadece virgül, daha sonra 0 veya daha fazla virgül olmayan satır sonuna kadar arar. Parantezler, sonra \1(veya $1perl olarak) başvurabileceğimiz son alanları yakalar . Bu daha sonra çift tırnak içinde kendiliğinden yer değiştirir. -iYerinde dosyasını düzenleme için, değişiklikler orijinal dosyaya yapılır edilir.

Ayrıca awkşunları da kullanabilirsiniz :

awk -F, -vOFS=, '{sub(/"/,"",$(NF-1)); $NF="\""$NF"\""}1;' file

Veya, sürümünüz destekliyorsa:

awk -iinplace -F, -vOFS=, '{sub(/"/,"",$(NF-1)); $NF="\""$NF"\""}1;' file 

1
OP "ikinci alanın sonunda ortadan kaldırmak istiyor .
muru

@muru teşekkürler, bunu özlemiştim. Ayrıca, benimkini göndermeden önce cevabını görmeyi özledim. Farklılaştırmak için daha fazla bir şey ekledi.
Terdon
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.