ฉันมีไฟล์ CSV เช่นนี้:
abd,123,egypt,78
cde,456,england,45
ฉันจะรับจำนวนตัวอักษรของคำในคอลัมน์ที่ 3 ได้อย่างไร
ฉันไม่สามารถหาวิธีwc
ทำสิ่งนี้ได้
ฉันมีไฟล์ CSV เช่นนี้:
abd,123,egypt,78
cde,456,england,45
ฉันจะรับจำนวนตัวอักษรของคำในคอลัมน์ที่ 3 ได้อย่างไร
ฉันไม่สามารถหาวิธีwc
ทำสิ่งนี้ได้
คำตอบ:
cut -d, -f3 | tr -d '\n' | wc -m
(จำไว้ว่าwc -c
นับเป็นไบต์ไม่ใช่ตัวอักษร:
$ 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
ให้จำนวนตัวละครกับฉันได้ซึ่งเป็นเหตุผลที่ฉันแสดงวิธีใช้wc
ในบริบทนี้
awk -F, '{sum+=length($3)}; END {print +sum}' file
awk
ถูกออกแบบมาสำหรับการประมวลผลไฟล์ตามคอลัมน์แบบบรรทัดต่อบรรทัด ปัญหาเหมาะอย่างยิ่งสำหรับเครื่องมือ
0
แทนที่จะเป็นบรรทัดว่างเมื่อไฟล์อินพุตว่างเปล่า
awk
) ร่วมมือกับกรณี (ทำงานพร้อมกัน) ในจิตวิญญาณ Unix ทั่วไป คุณอาจจะแจ้งให้ทราบว่าการตัด + TR + wc หนึ่งเป็น 5 ประเภทให้เร็วที่สุดเท่าหนึ่ง awk นี้เอง 5 ครั้งที่รวดเร็วเป็นperl
อย่างใดอย่างหนึ่ง (อย่างน้อยในระบบของฉันในภาษา UTF8 ลองบนไฟล์ 100MB)
perl
วิธีการแก้ปัญหา:
perl -Mopen=:locale -F, -anle '$sum += length($F[2]); END{print $sum}' file
หรือรุ่นที่สั้นกว่า:
perl -Mopen=:locale -F, -anle '$sum += length($F[2])}{print $sum' file
-Mopen=:locale
สำหรับperl
การใช้คำนิยามผู้ใช้ / ของระบบของสิ่งที่ตัวละครเป็นอย่างอื่นก็ถือว่าเป็นตัวละครไบต์ ลองa,1,españa,2
อินพุตในโลแคล UTF-8 (ค่าเริ่มต้นในระบบส่วนใหญ่)
cut -d, -f3 <<\DATA | grep -o . | grep -c .
abd,123,egypt,78
cde,456,england,45
DATA
#OUTPUT
12
คุณสามารถใช้
awk -F, '{printf "%s", $3}' file | wc -m
ใน Perl:
perl -F, -Mopen=:locale -lane 'print length $F[2]' your_file
ด้วยไฟล์ตัวอย่างของคุณเช่น:
$ 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
การทำงานกับwc
การนับจำนวนแต่ละบรรทัดนั้นอาจเป็นเรื่องยุ่งยาก คุณต้องเรียกมันสำหรับแต่ละสตริงจากคอลัมน์ 3 ทีละอันซึ่งทำให้ยุ่งยากเล็กน้อยในการทำสิ่งที่คุณต้องการ คุณต้องตรวจสอบแต่ละแถวของ CSV แยกคอลัมน์ที่ 3 แล้วแสดงwc
เพื่อรับจำนวนตัวอักษร
การใช้sed
และawk
sed 's/.*,.*,\(.*\),.*/\1/g' file | awk -v FS="" '{print NF;}'
ตัวอย่าง:
$ (echo abd,123,egypt,78; echo cde,456,england,45;) | sed 's/.*,.*,\(.*\),.*/\1/g' | awk -v FS="" '{print NF;}'
5
7
สอง awk ของ
awk -F, '{print $3}' file | awk -v FS="" '{print NF;}'
ตัวอย่าง:
$ (echo abd,123,egypt,78; echo cde,456,england,45;) | awk -F, '{print $3}'| awk -v FS="" '{print NF;}'
5
7
wc
คำสั่งเพื่อรับเอาต์พุต!'