Bir sütun değerine dayalı olarak bir dosyadan verileri ayıklayın ve farklı dosyalara yerleştirin


14

Aşağıdaki değerlere sahip bir csv dosyası oluşturacağız

yp1234,577,1,3
yp5678,577,3,5
yp9012,132,8,9

Verileri ayıklamak ve ikinci sütuna göre dosya oluşturmak gerekiyor. 577 ise, tüm satır çıkarılmalı ve ayrı bir dosyaya yerleştirilmelidir. Yani ikinci sütunu tek başına 577 ve ikinci sütunu tek başına 132 olan bir dosyaya ihtiyacım var

IF kullanmayı denedim ama işe yaramadı


5
Aslında çalışmayan kodu göndermek her zaman iyi bir fikirdir.
goldilocks

Yanıtlar:


27

Kullanım awk:

awk -F, '{ print > $2 ".csv" }' file.csv

Bu, iki dosyayı 577.csvve 132.csvgeçerli dizininizi oluşturur.

Komut yukarıda yalnızca olabileceğini varsayar 132veya 577ikinci alan olarak. Tümünün ikinci alanında bulunan değerlerin her biri için bir dosya adı oluşturur file.csv.

İlgilendiğiniz ikisi dışında başka değerler varsa ve bu satırları yoksaymak istiyorsanız, bunun yerine bunu yapın:

awk -F, '$2 == "577" || $2 == "132" { print > $2 ".csv" }' file.csv

1
Kullanamayacağınız hatalı awkuygulamalar var print > $2 ".cvs". O, İlk bilgi işlem için dosya adını olurdu, o zaman yapmak print: fname = $2 ".cvs"; print > fname.
Kusalananda

3

Terdon'un awkçözümünü seviyorum , ancak tamlık uğruna, sadecebash

while IFS=, read -r a1 a2 a3 a4; do 
    echo "$a1,$a2,$a3,$a4" >> "$a2".csv
done < file.csv

Bu dosyalar üretecek 577.csvve 132.csvgeçerli dizinde.


3

577'nin tümünü stdout'a çıkarmak için

grep -e '^.*,577,.*,.*$' youfile.csv >result_extract_557.csv

- edit 1 Düzeltme, 577 ile en az 3 virgül olduğunda yanlış eşleşmeleri önlemek için @ terdon'un aşağıdaki yorumuna dayanarak düzeltildi.

grep -e '^[:alnum:]*,577,[:digit:]*,[:digit:]*$' youfile.csv >result_extract_557.csv

Ancak awkçözümünün daha kapsamlı olduğunu düşünüyorum .


577 başka bir alanda olsa bile, ikinci değil veya bir alanın parçası olsa bile bu eşleşecektir. Örneğin foo577barveya yp9012,132,8,577.
terdon

Virgüllerin alan pozisyonunu bağımlı kılacağını düşündüm.
X Tian

Üzgünüm, kötü örnekler verdim ancak .*virgülle de eşleşebilir, böylece hangi alanı eşleştirdiğinizi bilmiyorsunuz. İkincisi olabilir, 45'inci de olabilir. İkinci şikayetim yanlıştı, virgüllerin eşleşmekten koruduğu konusunda haklısın foo577bar.
terdon

ne yapmalı | yerine, karakteri kullanılır.
user3116123

alma hatası grep: geçersiz seçenek - e Kullanım: grep -hblcnsviw desen dosyası. . .
user3116123

1

Kullanma csvkit:

$ csvgrep -c 2 -m 577 data.csv >output.csv

-c 2Markaları cvsgrepikinci sütunu düşünün ve birlikte -m 577biz dize maç için sormak 577o sütundaki.

Aşağıdakilere yazılacaktır output.csv:

yp1234,577,1,3
yp5678,577,3,5

Birkaç dizeyi eşleştirmek ve çıktıyı her dize için bir dosyaya yazmak için:

for pattern in 577 132; do
  csvgrep -c 2 -m "$pattern" data.csv >"output-$pattern.csv"
done

Bu iki dosyayı oluşturur output-132.csvve output-577.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.