Làm cách nào để có được số lượng ký tự của các từ trong một cột cụ thể?


12

Tôi có một tệp CSV như thế này:

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

Làm thế nào tôi có thể có được số lượng ký tự chỉ các từ cột thứ 3?

Tôi không thể tìm ra cách wcđể làm điều này.

Câu trả lời:


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

(hãy nhớ rằng wc -cđếm byte, không phải ký tự:

$ 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

)


Nhưng anh ấy chỉ định 'Tôi không thể sử dụng wclệnh để có đầu ra!'
mikeerv

3
@mikeerv, mà tôi giải thích khi tôi không thể wcđưa cho tôi số lượng nhân vật , đó là lý do tại sao tôi chỉ ra cách sử dụng wctrong bối cảnh này.
Stéphane Chazelas

Ồ .... Đó là một cách giải thích rất hợp lệ mà không bao giờ xảy ra với tôi ...
mikeerv

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

3
Amen; awkđược thiết kế để xử lý các tệp dựa trên cột, từng dòng một. Vấn đề là hoàn toàn phù hợp cho các công cụ.
Ray

Mục đích của + trong {print + sum} là gì? {in sum} cũng hoạt động tốt.
spuder

3
@spuder, đó là để in 0thay vì một dòng trống khi tệp đầu vào trống.
Stéphane Chazelas

2
@Ray, mặt khác, nhiệm vụ có thể đạt được bằng cách có 3 tiện ích cơ bản (mỗi tiện ích là một phần nhỏ của kích thước awk) hợp tác với vụ án (hoạt động đồng thời) theo tinh thần Unix điển hình. Bạn có thể nhận thấy cách cắt + tr + wc một là 5 loại nhanh như thế này, chính nó nhanh gấp 5 lần so với loại này perl. (ít nhất là trên hệ thống của tôi, trong ngôn ngữ UTF8, đã thử trên tệp 100MB).
Stéphane Chazelas

5

Một perlgiải pháp:

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

hoặc phiên bản ngắn hơn:

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

Lưu ý rằng nó trả về số byte, không nhất thiết phải là số ký tự.
Stéphane Chazelas

@StephaneChazelas: length () trả về số lượng ký tự logic, không phải byte vật lý theo perldoc.
cuonglm

Nhưng bạn cần -Mopen=:localecho perlsử dụng user / định nghĩa hệ thống của những gì một nhân vật là, nếu không nó giả định nhân vật byte. Thử a,1,españa,2đầu vào trong ngôn ngữ UTF-8 (mặc định trên hầu hết các hệ thống).
Stéphane Chazelas

@StephaneChazelas: Ồ, đã cập nhật câu trả lời của tôi. Cảm ơn cho điểm tốt!
cuonglm

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

#OUTPUT
12

3

Bạn cũng có thể sử dụng

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

3

Trong Perl:

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

1

Với tệp mẫu của bạn như vậy:

$ 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

Làm việc với wcđể có được số lượng của mỗi dòng có thể khó khăn. Bạn phải gọi nó cho từng chuỗi từ cột 3 riêng lẻ, điều này làm cho nó hơi khó để làm những gì bạn muốn. Bạn phải xem qua từng hàng CSV của bạn, trích xuất cột 3 và sau đó trình bày nó wcđể lấy số ký tự.


0

Sử dụng sedawk

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

Thí dụ:

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

Hai awk

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

Thí dụ:

$ (echo abd,123,egypt,78; echo cde,456,england,45;) | awk -F, '{print $3}'| awk -v FS="" '{print NF;}'
5
7
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.