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.
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:
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
)
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.
awk -F, '{sum+=length($3)}; END {print +sum}' file
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ụ.
0thay vì một dòng trống khi tệp đầu vào trống.
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).
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
-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).
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ự.
Sử dụng sedvàawk
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
wclệnh để có đầu ra!'