Bagaimana cara mendapatkan jumlah karakter dari kata-kata di kolom tertentu?


12

Saya memiliki file CSV seperti ini:

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

Bagaimana saya bisa mendapatkan jumlah karakter hanya kata-kata kolom 3?

Saya tidak tahu bagaimana cara wcmelakukan ini.

Jawaban:


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

(ingat yang wc -cmenghitung byte, bukan karakter:

$ 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

)


Tapi dia menjelaskan, 'Saya tidak bisa menggunakan wcperintah untuk mendapatkan hasil!'
mikeserv

3
@ mikeserv, yang saya tafsirkan karena saya tidak bisa wcmemberi saya jumlah karakter yang mengapa saya menunjukkan cara menggunakan wcdalam konteks ini.
Stéphane Chazelas

Oh .... Itu adalah interpretasi yang sangat valid yang tidak pernah terjadi pada saya ...
mikeserv

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

3
Amin; awkdirancang untuk memproses file berbasis kolom, baris demi baris. Masalahnya sangat cocok untuk alat ini.
Ray

Apa tujuan + dalam {print + sum}? {print sum} juga berfungsi.
Spuder

3
@spuder, itu untuk mencetak 0bukan baris kosong ketika file input kosong.
Stéphane Chazelas

2
@ Ray, di sisi lain, tugas dapat dicapai dengan memiliki 3 utilitas dasar (masing-masing menjadi sebagian kecil dari ukuran awk) bekerja sama dengan case (bekerja secara bersamaan) dalam semangat Unix yang khas. Anda mungkin memperhatikan bahwa cut + tr + wc one adalah 5 jenis secepat yang ini awk sendiri 5 kali lebih cepat dari yang perlsatu. (setidaknya pada sistem saya, di lokal UTF8, mencoba pada file 100MB).
Stéphane Chazelas

5

Sebuah perlsolusi:

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

atau versi yang lebih pendek:

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

Perhatikan bahwa ia mengembalikan jumlah byte, belum tentu jumlah karakter.
Stéphane Chazelas

@StephaneChazelas: length () mengembalikan jumlah karakter logis, bukan byte fisik sesuai dengan perldoc.
cuonglm

Tapi Anda perlu -Mopen=:localeuntuk perlmenggunakan user / definisi sistem apa karakter adalah, jika tidak mengasumsikan karakter byte. Coba pada a,1,españa,2input di lokal UTF-8 (default pada kebanyakan sistem).
Stéphane Chazelas

@StephaneChazelas: Oh, perbarui jawaban saya. Terima kasih untuk poin yang bagus!
cuonglm

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

#OUTPUT
12

3

Anda juga bisa menggunakannya

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

3

Dalam Perl:

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

1

Dengan file sampel Anda seperti ini:

$ 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

Bekerja dengan wcuntuk mendapatkan hitungan setiap baris bisa rumit. Anda harus memanggilnya untuk setiap string dari kolom 3 secara individual yang membuatnya agak sulit untuk melakukan apa yang Anda inginkan. Anda harus melihat melalui setiap baris CSV Anda, ekstrak kolom 3 dan kemudian sajikan wcuntuk mendapatkan jumlah karakter.


0

Menggunakan seddanawk

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

Contoh:

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

Dua awk

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

Contoh:

$ (echo abd,123,egypt,78; echo cde,456,england,45;) | awk -F, '{print $3}'| awk -v FS="" '{print NF;}'
5
7
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.