Alt çizgiyi virgülle değiştirme ve CSV'de çift tırnak işaretlerini kaldırma


10

Olarak bir CSV dosyam var

input.csv

"1_1_0_0_76"
"1_1_0_0_77"
"1_1_0_0_78"
"1_1_0_0_79"
"1_1_0_0_80"
"1_1_0_0_81"
"1_1_0_0_82"
"1_1_0_0_83"
"1_1_0_0_84"
"1_1_0_0_85"

............. ve bunun gibi.

Bu CSV dosyasını dönüştürmem gerekiyor

result.csv 

1,1,0,0,76
1,1,0,0,77
1,1,0,0,78
1,1,0,0,79
1,1,0,0,80
1,1,0,0,81
1,1,0,0,82
1,1,0,0,83
1,1,0,0,84
1,1,0,0,85

Yanıtlar:


24

Kullanmanın çok daha basit yolu tr

$ tr '_' ',' < input.csv | tr -d '"'                  
1,1,0,0,76
1,1,0,0,77
1,1,0,0,78

Bunun çalışma şekli triki argümanı alır - değiştirilecek karakter kümesi ve bunların değiştirilmesi. Bu durumda sadece 1 karakterlik setlerimiz vardır. input.csvGirişin trstdin akışını <kabuk operatörü üzerinden yönlendiririz ve elde edilen çıktıyı tr -d '"'çift ​​tırnakları silmek için yönlendiririz.

Ama awkbunu da yapabilir.

$ cat input.csv
"1_1_0_0_76"
"1_1_0_0_77"
"1_1_0_0_78"
$ awk '{gsub(/_/,",");gsub(/\"/,"")};1' input.csv
1,1,0,0,76
1,1,0,0,77
1,1,0,0,78

Bunun çalışma şekli biraz farklıdır: awk her dosya satır satır okur, her satır içi komut dosyasıdır /Pattern match/{ codeblock}/Another pattern/{code block for this pattern}. Burada bir modelimiz yok, bu yüzden her satır için kod bloğu yürütmek anlamına geliyor. gsub()işlevi bir satır içindeki genel ikame için kullanılır, bu nedenle alt çizgileri virgülle ve çift tırnak işaretlerini boş bir dizeyle (karakteri etkili bir şekilde silme) değiştirmek için kullanırız. 1Varsayılan basitçe hattını baskı için kod bloğunu, eksik desen maçın yerinde olduğundan; başka bir deyişle ile kod bloğu gsub()işi yapar ve 1sonucu yazdırır.

>Çıktıyı yeni bir dosyaya göndermek için kabuk yeniden yönlendirmesini ( ) kullanın:

 awk '{gsub(/_/,",");gsub(/\"/,"")};1' input.csv > output.csv

Özür dilerim. Ters virgülleri de kaldırmak istedim. Soruyu güncelledim
RKR

@RKR Yanıt buna göre güncellendi, Ian'ın yanıtı da güncelleniyor
Sergiy Kolodyazhnyy

13

Alternatif olarak, bu sedkomutu da kullanabilirsiniz :

$ sed -e 's/_/,/g' -e 's/"//g' input.csv
1,1,0,0,76
1,1,0,0,77
1,1,0,0,78

1
Tek tırnak içinde, çift tırnaktan kaçmanıza gerek yoktur.
glenn jackman

Gerçekten @glennjackman! Kaçan ters eğik çizgiyi çıkardım
IanC

10

Komut satırı metin işlemenin "İsviçre ordusu testere" olan Perl de bunu yapabilir. Sözdizimi (tesadüfen değil) trve sedörneklere oldukça benzer :

perl -pe 'tr/_"/,/d' input.csv > result.csv

veya:

perl -pe 's/_/,/g; s/"//g' input.csv > result.csv

Ama dürüst olmak gerekirse, sadece bu temel görev için yeni bir programlama dili (bu gerçekten ne garip, Perl ve sed ve onlar gibi diğer araçlar) öğrenmek için zaman ayırmak istemiyorsanız, bunu da yapabilirsiniz aramayı ve değiştirmeyi destekleyen herhangi bir metin düzenleyici:

  1. CSV dosyasını favori metin düzenleyicinizde açın (örneğin, gedit, kate, mousepad, vb; Windows'ta düz eski Not Defteri veya Wordpad bile bunu yapabilir).

  2. Menüden "Ara ve Değiştir" i seçin (ayrı bir "Ara" menüsü yoksa genellikle "Düzenle" altında bulunur).

  3. Giriş _ Arama kutusuna ve ,yedek kutuya.

  4. "Tümünü Değiştir" i tıklayın.

  5. Şununla tekrarla: "Arama kutusunda ve değiştirme kutusunda hiçbir şeyi .

  6. Dosya 'yı kaydet.

Şimdi, bunu sadece bir yerine 100 veya 1000 dosya için yapmanız gerekiyorsa, yeni bir komut satırı aracı öğrenmek mantıklı olmaya başlar. Ve elbette, Perl veya sed'i veya herhangi bir şeyi nasıl kullanacağınızı öğrendikten sonra, daha sonra benzer görevlerle çok fazla zaman ve çabadan tasarruf edersiniz. Ancak, tekrar yapmayı beklemediğiniz tek seferlik bir iş için, bazen metin editörü gibi temel bir interaktif araç en basit çözümdür.


3

Bunu da yapabilirsiniz vim.

Dosyayı açın: vim input.csvve ardından vimgelişmiş arama aracını kullanın s. :Komut moduna girmek için colon ( ) yazın ve aşağıdaki gibi komutları çalıştırın:

:%s's/_/,/g'  -- Replaces all occurrences of _ with , in the current file.
:s/\"//g -- Replaces all occurrences of " with nothing in the current file.

IanC'nin cevabındaki komutlarla hemen hemen aynı, ama vimkullanmak yerine sed.


2

Neden yalnızca giriş ve çıkış Ayırıcı değerlerinin varsayılan değerlerini değiştirmiyorsunuz?

awk -F "_" 'BEGIN { OFS="," }; {gsub(/\"/,""); print $1,$2,$3,$4,$5}' input.csv
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.