ฉันจะนับบรรทัดข้อความได้อย่างไร


14

ฉันจะนับจำนวนบรรทัดในไฟล์ข้อความได้อย่างไร เช่น :

command file.txt

หมายเหตุฉันต้องการนับเฉพาะบรรทัดที่ไม่ว่างเท่านั้น (บรรทัดที่ไม่นับพื้นที่สีขาวและแท็บ)?



4
คำถามไม่ได้กำหนดไว้อย่างชัดเจน: มีบรรทัดที่มีช่องว่างเท่านั้น (ช่องว่างและ TAB) ถือว่าว่างเปล่าหรือไม่
Rmano

ปิดผู้ลงคะแนน : คำถามแก้ไขหลังจากการชี้แจงของ @ Rmano ตามความคิดเห็นของเขาโดย OP ดังนั้นโปรดอย่าโหวตให้ปิดเหมือน
Unclear

2
@KasiyA มันยังไม่ชัดเจน ฉันไม่เข้าใจว่า OP ต้องการนับ sa ด้วยช่องว่างเท่านั้น (ช่องว่างแท็บ\r) หรือข้ามพวกเขา ปัจจุบันตอบรับทุกจำนวนบรรทัดด้วยช่องว่างและข้ามเฉพาะบรรทัดที่ว่างเปล่า
terdon

@terdon OP ไม่ต้องการนับบรรทัดว่าง (รวมถึงบรรทัดว่าง ( \rหรือ\n), บรรทัดที่มีแท็บเท่านั้นและบรรทัดที่มีช่องว่างเท่านั้น) และต้องการข้ามพวกเขาตามที่ฉันคิดและตอบตาม สิ่งที่ฉันเข้าใจ
αғsнιη

คำตอบ:


11

คำตอบข้างต้นนั้นถูกต้อง แต่แตกต่างกันเล็กน้อยคุณสามารถใช้grepเพื่อเพื่อง่ายขึ้นรหัสเช่นgrep -vc '^$' file.txt

ตัวอย่างเช่น (A): file.txt

$grep -vc '^$' file.txt

1    First line         #This is two tabs to comment.
2    
4
3    Fourth line        #Another two tabs to comment.

$2

ตัวอย่างเช่น (B): file.txt

$sed '/^$/d' file.txt | wc -l

1    First line         #This is two tabs to comment.
2    
4
3    Fourth line        #Another two tabs to comment.

$4

สังเกตเห็นผลลัพธ์ที่ได้คือ 4! เมื่อเราต้องการที่จะคาดหวังเพียงสอง แต่จะนับแท็บระหว่างเนื้อหาและความคิดเห็นด้วย

สังเกตการนับจาก 0 และนับจาก 1 มันแตกต่างจาก grep ไปยัง sed ที่ฉันจำรายละเอียดเพิ่มเติมค้นหา grep หรือ sed


1
ตัวอย่างทั้งสองของคุณจะนับบรรทัดว่างเปล่า แต่ OP ขอให้คำสั่งนับทุกอย่าง แต่บรรทัดว่าง
kos

2
ที่จริงฉันผิดที่sedตัวเลือกที่ถูกต้องจริง แต่grepอย่างใดอย่างหนึ่งไม่ได้
คอส

เป็นเพียงบางส่วนที่ถูกต้องฉัน downvote คำตอบวางฉันแสดงความคิดเห็นเมื่อคุณได้รับการแก้ไขเพื่อให้ฉันสามารถลบ downvote ของฉัน
kos

1
@ kos ฉันค่อนข้างแน่ใจคุณสังเกตเห็นว่าคำถามที่คลุมเครือนั้นคืออะไร?
amrx

2
@ kos คุณถูกต้องตั้งแต่แรกขอบคุณ ฉันไม่ได้นอนใน 36 ชั่วโมงฉันเดาว่าถึงเวลานอนแล้ว!
amrx

12

ลองsed:

sed '/^$/d' file.txt | wc -l

หากคุณมีบรรทัดใด ๆ ที่มีช่องว่างหรือแท็บเท่านั้นและหากคุณต้องการเพิกเฉยมันก็จะนับ

sed '/^[[:blank:]]*$/d' file.txt | wc -l

3
ฉันจะใช้^\s*$เพื่อพิจารณาบรรทัดบัญชีที่มีแท็บหรือช่องว่างเท่านั้น
Sylvain Pineau

@SylvainPineau: เพิ่ม ..
heemayl

1
ฉันยอมรับว่ามันไม่ชัดเจนจากคำถามของ OP แต่ข้อความที่มีช่องว่าง / แท็บสามารถแก้ไขผลลัพธ์ที่คาดหวัง +1
Sylvain Pineau


3

คุณสามารถใช้ได้:

grep -cve '^\s*$' file.txt

หากคุณต้องการคำสั่งเพียงแค่วางบรรทัดต่อไปนี้ลงใน.bashrcและรีสตาร์ทเซสชันเชลล์หรือเปิดเทอร์มินัลใหม่:

count_lines()
{
    grep -cve '^\s*$' $1
}

ตัวอย่าง:

count_lines file.txt
42

2

ด้วย :

awk 'NF{++count} END{print count}' file

คำอธิบาย:

NFระบุจำนวนสาขาและด้วยเหตุนี้พิมพ์นี้เพียงสายที่ไม่ว่างเปล่าตั้งแต่ในสายที่ไม่ว่างเปล่าNFมีค่ามากกว่า0และประเมินผลให้เป็นจริง ดังนั้นที่เพิ่มขึ้นนับธงเมื่อ awk พบสายที่ไม่ว่างและพิมพ์ค่าล่าสุดนับEND{print count}ธงในตอนท้ายด้วย


1

แก้ไข : คุณสามารถเพิ่มcตัวเลือกgrepแทนการวางทุกอย่างลงwcในดูคำตอบของ @ muru สำหรับรุ่นที่กะทัดรัดกว่า


ด้วยgrep:

grep -v '^$' file.txt | wc -l

0

วิธีการแก้ปัญหา Perl

Perl สามารถทำได้ โดยทั่วไปการนับบรรทัดทำงานดังนี้:

$ perl -ne 'END{print $.}' input.txt                                                                                     

หากเราต้องการยกเว้นบรรทัดว่างทั้งหมดเราจะทำสิ่งนี้:

$ perl -ne '$c+=1 if not /^$|^\s+$/;END{print $c}' input.txt                                                             

สมมติว่าเรามีไฟล์อินพุตเช่นนี้

$ cat -n input.txt
     1  Cat; Dog; Squirrel
     2  ORGANISM Animalus terrus
     3  
     4  Sequence: ACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGT
     5  

มีทั้งหมด 5 บรรทัด 2 บรรทัดว่าง คำสั่งที่เราจะส่งออก:

$ perl -ne '$c+=1 if not /^$|^\s+$/;END{print $c}' input.txt                                                             
3

การปรับปรุงหลายไฟล์

สิ่งนี้ทำงานได้ดีสำหรับไฟล์เดียว หากเราต้องการให้มันทำงานกับไฟล์หลายไฟล์เราสามารถทำสิ่งนี้:

$ perl -ne '$c+=1 if not /^$|^\s+$/;printf("%d %s\n",$c,$ARGV) and $c=0 if eof' input.txt /etc/passwd                    
3 input.txt
52 /etc/passwd
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.