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.