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 wc
trong 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ụ.
0
thay 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 perl
giả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=:locale
cho perl
sử 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 sed
và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
wc
lệnh để có đầu ra!'