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.

pengguna3116123
sumber

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

)

Stéphane Chazelas
sumber
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
Hauke ​​Laging
sumber
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
cuonglm
sumber
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
mikeserv
sumber
3

Anda juga bisa menggunakannya

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

Dalam Perl:

perl -F, -Mopen=:locale -lane 'print length $F[2]' your_file
Joseph R.
sumber
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.

slm
sumber
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
Avinash Raj
sumber