CSV dosyasını işlemek için bir komut dosyasında birden fazla sed komutuna katılın


34

Bunun gibi bir CSV dosyasına sahip olmak:

HEADER
"first, column"|"second "some random quotes" column"|"third ol' column"
FOOTER

ve şöyle bir sonuç arıyorum:

HEADER
first, column|second "some random quotes" column|third ol' column

Başka bir deyişle, "FOOTER" ifadesini kaldırmak, başında, sonunda ve çevresinde |

Şimdiye kadar bu kod çalışıyor:

sed '/FOOTER/d' csv > csv1 | #remove FOOTER
sed 's/^\"//' csv1 > csv2 | #remove quote at the beginning
sed 's/\"$//' csv2 > csv3 | #remove quote at the end
sed 's/\"|\"/|/g' csv3 > csv4 #remove quotes around pipe

Gördüğünüz gibi 4 ekstra dosya oluşturuyor.

İşte, fazladan dosyalar yaratmamak ve aynı şeyi tek bir komut dosyasında yapmak gibi bir amacı olan başka bir çözüm. Çok iyi çalışmıyor.

#!/bin/ksh

sed '/begin/, /end/ { 
        /FOOTER/d
        s/^\"//
        s/\"$//
        s/\"|\"/|/g 
}' csv > csv4

1
Tırnaklarınız olduğundan, alanlarda yeni satırlara sahip olabilirsiniz. senin sedsadece basitleştirilmiş csv ile, bunda işe gitmiyor. Gerçek CSV dosyalarını (Python / Perl / Ruby) işleyebilen bir kitaplık içeren bir programlama dili kullanın.
Anthon

Yanıtlar:


44

Her şeyden önce, Michael'ın gösterdiği gibi, hepsini bir tek komutta birleştirebilirsiniz:

sed '/^FOOTER/d; s/^\"//; s/\"$//; s/\"|\"/|/g' csv > csv1

Bazı seduygulamaların bununla baş edemediğini ve ihtiyaç duyabileceğini düşünüyorum:

  sed -e '/^FOOTER/d' -e 's/^\"//' -e 's/\"$//' -e 's/\"|\"/|/g' csv > csv1

Bununla birlikte, alanlarınız tarafından tanımlanmış gibi görünüyor |ve sadece "alanın içinde kalanları bırakarak tüm alanın çevresini kaldırmak istiyorsunuz . Bu durumda, şunları yapabilirsiniz:

$ sed '/FOOTER/d; s/\(^\||\)"/\1/g; s/"\($\||\)/\1/g' csv 
HEADER
first, column|second "some random quotes" column|third ol' column

Veya, GNU ile sed:

sed -r '/FOOTER/d; s/(^|\|)"/\1/g; s/"($|\|)/\1/g' csv 

Perl'i de kullanabilirsiniz:

$ perl -F"|" -lane 'next if /FOOTER/; s/^"|"$// for @F; print @F' csv 
HEADER
first, column|second some random quotes column|third ol' column

13

Bu da işe yarar:

sed 's / ^ "//; s /" | "/ | / g; s /" "$ /" /'

Örnek:

$ echo '"this"|" and "ths""|" and "|" this 2"|" also "this", "thi", "and th""' | 
sed 's/^"//; s/"|"/|/g; s/""$/"/'
this| and "ths"| and | this 2| also "this", "thi", "and th"

güzel sürüm

sed '
s/^"//
s/"|"/|/g
s/""$/"/
$d
'

1
Bu altbilgi ile ilgilenmiyor.
terdon

3
Ancak, içeriği ne olursa olsun son satırı kaldıracaktır. Hayır ise FOOTER, istenen verileri kaldıracaktır.
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.