ฉันจะรับจำนวนตัวอักษรของคำในคอลัมน์ใดคอลัมน์หนึ่งได้อย่างไร


12

ฉันมีไฟล์ CSV เช่นนี้:

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

ฉันจะรับจำนวนตัวอักษรของคำในคอลัมน์ที่ 3 ได้อย่างไร

ฉันไม่สามารถหาวิธีwcทำสิ่งนี้ได้

คำตอบ:


23
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คำสั่งเพื่อรับเอาต์พุต!'
mikeserv

3
@ mikeserv ซึ่งฉันตีความว่าฉันไม่สามารถwcให้จำนวนตัวละครกับฉันได้ซึ่งเป็นเหตุผลที่ฉันแสดงวิธีใช้wcในบริบทนี้
Stéphane Chazelas

โอ้ .... นั่นคือการตีความที่ถูกต้องอย่างมากซึ่งไม่เคยเกิดขึ้นกับฉันเลย ...
mikeserv

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

3
สาธุ; awkถูกออกแบบมาสำหรับการประมวลผลไฟล์ตามคอลัมน์แบบบรรทัดต่อบรรทัด ปัญหาเหมาะอย่างยิ่งสำหรับเครื่องมือ
เรย์

จุดประสงค์ของ + ใน {print + sum} คืออะไร {print sum} ก็ใช้ได้เช่นกัน
spuder

3
@spuder นั่นคือการพิมพ์0แทนที่จะเป็นบรรทัดว่างเมื่อไฟล์อินพุตว่างเปล่า
Stéphane Chazelas

2
@ เรย์ในทางกลับกันงานสามารถทำได้โดยมี 3 สาธารณูปโภคพื้นฐาน (แต่ละคนเป็นเศษส่วนของขนาดawk) ร่วมมือกับกรณี (ทำงานพร้อมกัน) ในจิตวิญญาณ Unix ทั่วไป คุณอาจจะแจ้งให้ทราบว่าการตัด + TR + wc หนึ่งเป็น 5 ประเภทให้เร็วที่สุดเท่าหนึ่ง awk นี้เอง 5 ครั้งที่รวดเร็วเป็นperlอย่างใดอย่างหนึ่ง (อย่างน้อยในระบบของฉันในภาษา UTF8 ลองบนไฟล์ 100MB)
Stéphane Chazelas

5

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

โปรดทราบว่ามันส่งกลับจำนวนไบต์ไม่จำเป็นต้องนับตัวอักษร
Stéphane Chazelas

@StephaneChazelas: length () ส่งคืนจำนวนอักขระโลจิคัลที่ไม่ใช่ฟิสิคัลไบต์ตาม perldoc
cuonglm

แต่คุณจำเป็น-Mopen=:localeสำหรับperlการใช้คำนิยามผู้ใช้ / ของระบบของสิ่งที่ตัวละครเป็นอย่างอื่นก็ถือว่าเป็นตัวละครไบต์ ลองa,1,españa,2อินพุตในโลแคล UTF-8 (ค่าเริ่มต้นในระบบส่วนใหญ่)
Stéphane Chazelas

@StephaneChazelas: โอ้อัพเดตคำตอบของฉัน ขอบคุณสำหรับจุดดี!
cuonglm




1

ด้วยไฟล์ตัวอย่างของคุณเช่น:

$ 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เพื่อรับจำนวนตัวอักษร


0

การใช้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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.