Belirli bir sütundaki kelimelerin karakter sayısını nasıl alabilirim?


12

Ben böyle bir CSV dosyası var:

abd,123,egypt,78
cde,456,england,45

Yalnızca 3. sütun kelimelerinin karakter sayısını nasıl alabilirim?

Bunu nasıl wcyapacağımı bulamıyorum.

Yanıtlar:


23
cut -d, -f3 | tr -d '\n' | wc -m

( wc -ckarakterleri değil, bayt sayıldığını unutmayın :

$ echo a,1,españa,2 | cut -d, -f3 | tr -d '\n' | wc -c
7
$ echo a,1,españa,2 | cut -d, -f3 | tr -d '\n' | wc -m
6

)


Ancak ' wcÇıktı almak için komut kullanamıyorum !'
mikeserv

3
mikeserv, bana karakter sayısını veremediğim içinwc yorumladığım, bu yüzden wcbu bağlamda nasıl kullanılacağını gösterdim.
Stéphane Chazelas

Oh .... Bu hiç aklıma gelmeyen çok geçerli bir yorum ...
mikeserv

22
awk -F, '{sum+=length($3)}; END {print +sum}' file

3
Amin; awksütun tabanlı dosyaları satır satır işlemek için tasarlanmıştır. Sorun araca mükemmel şekilde uyar.
Ray

{Print + sum} içindeki + 'nın amacı nedir? {baskı toplamı} da aynı şekilde çalışır.
spuder

3
@spuder, 0girdi dosyası boş olduğunda boş satır yerine yazdırmak içindir .
Stéphane Chazelas

2
@ Öte yandan, görev, awktipik Unix ruhu içinde (aynı anda çalışan) dava ile işbirliği yapan 3 temel yardımcı programın (her biri büyüklüğünün bir kısmıdır) elde edilerek gerçekleştirilebilir . Cut + tr + wc'nin 5 tipinin ne kadar hızlı olduğunu fark edebilirsiniz, bu awk'ın kendisi 5 kat daha hızlıdır perl. (en azından sistemimde, UTF8 yerel ayarında, 100 MB'lık bir dosyada denedim).
Stéphane Chazelas

5

Bir perlçözüm:

perl -Mopen=:locale -F, -anle '$sum += length($F[2]); END{print $sum}' file

veya daha kısa bir sürüm:

perl -Mopen=:locale -F, -anle '$sum += length($F[2])}{print $sum' file

Bir karakter sayımı değil, bir bayt sayısı döndürdüğünü unutmayın.
Stéphane Chazelas

@StephaneChazelas: length (), perldoc'a göre fiziksel baytları değil mantıksal karakter sayısını döndürür.
cuonglm

Ama ihtiyacın -Mopen=:localeiçin perlbir karakter ne olduğu kullanıcı / sistemin tanımını kullanmak aksi takdirde karakterler bayt varsayar. a,1,españa,2UTF-8 yerel ayarında bir giriş yapmayı deneyin (çoğu sistemde varsayılan).
Stéphane Chazelas

@StephaneChazelas: Ah, cevabımı güncelledim. İyi puan için teşekkürler!
cuonglm

3
cut -d, -f3 <<\DATA | grep -o . | grep -c .
abd,123,egypt,78
cde,456,england,45
DATA

#OUTPUT
12

3

Ayrıca kullanabilirsiniz

awk -F, '{printf "%s", $3}' file | wc -m

3

Perl dilinde:

perl -F, -Mopen=:locale -lane 'print length $F[2]' your_file

1

Örnek dosyanızla:

$ cat sample.txt 
abd,123,egypt,78
cde,456,england,45

$ awk -F, '{print $3}' sample.txt | while read i; do echo "$i" | \
    tr -d '\n' | wc -m; done
5
7

Çalışma wcher hat sayısını elde etmek zor olabilir. Sütun 3'ten her dize için ayrı ayrı çağırmanız gerekir, bu da istediğinizi yapmak için biraz zorlaşır. CSV'nizin her satırına bakmanız, 3. sütunu çıkarmanız ve ardından wckarakter sayısını elde etmek için sunmanız gerekir.


0

kullanılması sedveawk

sed 's/.*,.*,\(.*\),.*/\1/g' file | awk -v FS="" '{print NF;}'

Misal:

$ (echo abd,123,egypt,78; echo cde,456,england,45;) | sed 's/.*,.*,\(.*\),.*/\1/g' | awk -v FS="" '{print NF;}'
5
7

İki awk

awk -F, '{print $3}' file | awk -v FS="" '{print NF;}'

Misal:

$ (echo abd,123,egypt,78; echo cde,456,england,45;) | awk -F, '{print $3}'| awk -v FS="" '{print NF;}'
5
7
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.