วิธีเพิ่มตัวนับบรรทัดสำหรับการแทนที่การเริ่มต้นบรรทัดด้วย AWK / …


9

ครั้งแรกที่ฉันคิดเกี่ยวกับ SED ( sed "s/^/COUNTER \&/" /tmp/1.tex) แต่มันถูกออกแบบมาสำหรับบรรทัดเดียวและฉันไม่สามารถเพิ่มตัวนับได้ด้วยความคิดดังนั้นตอนนี้awkเพราะฉันมีประสบการณ์ที่ยอดเยี่ยมด้วยgawkวิธีการแบบบูรณาการ ข้อมูล

What & South Dragon & North Dragon    & 5 \\ \hline
What & South Dragon & North Dragon    & 5 \\ \hline
What & South Dragon & North Dragon    & 5 \\ \hline

ผลลัพธ์ที่คาดหวัง

1 & What & South Dragon & North Dragon    & 5 \\ \hline
2 & What & South Dragon & North Dragon    & 5 \\ \hline
3 & What & South Dragon & North Dragon    & 5 \\ \hline

ระบบปฏิบัติการ: Debian 8.5

คำตอบ:


11

nl เป็นยูทิลิตี้ในการกำหนดหมายเลขบรรทัดของไฟล์การใช้งาน:

nl /path/to/file

ในกรณีเฉพาะของคุณ:

$ nl  -s ' & ' input.txt                                                                                                 
     1 & What & South Dragon & North Dragon    & 5 \\ \hline
     2 & What & South Dragon & North Dragon    & 5 \\ \hline
     3 & What & South Dragon & North Dragon    & 5 \\ \hline

คุณจะรวมสิ่งนี้กับตัวนับล่วงหน้าและเครื่องหมายแอมเปอร์แซนด์ได้อย่างไร - - ใช้งานได้กับตัวนับ แต่ไม่แน่ใจว่าสำหรับตัวหลัง
LéoLéopold Hertz 준영

3
nl -s ' &' /path/to/file. -sระบุสิ่งที่แยกตัวเลขออกจากเนื้อความของไฟล์อินพุต
DopeGhoti

1
nlแตกต่างจากcat -nและawkวิธีการแก้ปัญหาในการที่มันไม่ได้นับจำนวนบรรทัดว่างโดยค่าเริ่มต้น
iruvar

10

สิ่งนี้บรรลุสิ่งที่คุณต้องการ (เช่นเดียวกับawk '$0=NR" & "$0' filenameที่เป็นบิตลึกลับ)

awk '{print NR,"&",$0}' filename
1 & What & South Dragon & North Dragon    & 5 \\ \hline
2 & What & South Dragon & North Dragon    & 5 \\ \hline
3 & What & South Dragon & North Dragon    & 5 \\ \hline

หรือถ้าsedดีกว่านี้ให้ผลเหมือนกัน

sed = filename | sed 'N;s/\n/ \& /'

perl วิธีการ

perl -pe '$_="$. & $_"' filename
perl -pe 's/^/$. & /' filename

คุณพบไวยากรณ์นี้ได้sed = filename | ...อย่างไร - - ฉันไม่ทราบว่าคุณสามารถใช้ sed กับequalสัญลักษณ์ - - sedคำสั่งของคุณสามารถทำงานในสภาพแวดล้อมแบบไดนามิกได้หรือไม่? จุดอ่อนใด ๆ
LéoLéopold Hertz 준영

1
@ LéoLéopoldHertz준영ฉันดูภายใต้ man page =ผู้ดำเนินการอยู่ภายใต้ส่วน "Zero- หรือ One-address Commands"
Sergiy Kolodyazhnyy

ใช่= Print the current line number. ดังนั้นฟีเจอร์นี้จึงติดตั้งไว้ภายใน ดี!
LéoLéopold Hertz 준영

3

Python เป็นเครื่องมือทางเลือกที่ดีสำหรับสิ่งนี้:

$ python -c "import sys;lines=[str(i)+' & '+l for i,l in enumerate(sys.stdin,1)]; print ''.join(lines)" < input.txt      
1 & What & South Dragon & North Dragon    & 5 \\ \hline
2 & What & South Dragon & North Dragon    & 5 \\ \hline
3 & What & South Dragon & North Dragon    & 5 \\ \hline

วิธีการทำงานนี้คือการที่เราเปลี่ยนข้อความเป็น python stdin และอ่านบรรทัดจากที่นั่น enumerate()ฟังก์ชั่นคือสิ่งที่จะช่วยให้การนับบรรทัดโดยมีการsys.stdinระบุเป็นอินพุตและ1เป็นดัชนีเริ่มต้น ส่วนที่เหลือนั้นง่าย - เราสร้างรายการของสตริงใหม่โดยการคัดเลือกดัชนีเมื่อสตริงเข้าร่วมกับ' & 'สตริงและบรรทัดเอง ในที่สุดทั้งหมดที่ประกอบขึ้นใหม่จากรายการเป็นการทดสอบหนึ่งครั้งโดย''.join()ฟังก์ชั่น

หรือนี่คือเวอร์ชันหลายบรรทัดสำหรับไฟล์สคริปต์หรือเพื่อให้อ่านง่าย:

#!/usr/bin/env python
import sys

for index,line in enumerate(sys.stdin,1):
    print str(index) + ' & ' + line.strip()

ทำงานเหมือนกัน:

$ ./line_counter.py  < input.txt                                                                                         
1 & What & South Dragon & North Dragon    & 5 \\ \hline
2 & What & South Dragon & North Dragon    & 5 \\ \hline
3 & What & South Dragon & North Dragon    & 5 \\ \hline

แต่ถ้าคุณชอบทำด้วยวิธีทุบตีก็สามารถทำได้เช่นกัน:

$ counter=1; while read line ; do printf "%s & %s\n" "$counter" "$line" ; counter=$(($counter+1)) ; done < input.txt
1 & What & South Dragon & North Dragon    & 5 \ hline
2 & What & South Dragon & North Dragon    & 5 \ hline
3 & What & South Dragon & North Dragon    & 5 \ hline

1
@ LéoLéopoldHertz준영ถ้าฉันจะทำอย่างนั้นโดยไม่ต้องแจกแจงฉันจะต้องมีตัวแปรที่ติดตามจำนวนบรรทัดและฉันต้องเริ่มต้นตัวแปรนั้นและเพิ่มขึ้นในแต่ละครั้ง การใช้enumerate()บันทึกได้มากเหมือนรหัส 3 บรรทัด มันจะมีประโยชน์เมื่อจัดการกับสิ่งอื่น ๆ เช่นการประมวลผลรายการในรายการ ดูdocs.python.org/2/library/functions.html#enumerate
Sergiy Kolodyazhnyy

@ LéoLéopoldHertz준영หากคุณเข้าใจการใช้ตัวนับเหมือนที่ฉันทำbashแล้วรู้สึกอิสระที่จะใช้มัน :) ฉันเพิ่งพบจากประสบการณ์enumerate()ที่จะดูสง่างามยิ่งขึ้น แต่นั่นเป็นเพียงความคิดเห็นของฉัน ใช้วิธีการอื่นถ้าคุณคิดว่ามันชัดเจนกว่านี้
Sergiy Kolodyazhnyy

ตกลงenumerateชัดเจนกว่าการสร้างอินสแตนซ์ตัวแปร แลมบ์ดานิพจน์สามารถประหยัดพื้นที่ได้ไหม?
LéoLéopold Hertz 준영

@ LéoLéopoldHertz준영มันสามารถประหยัดเนื้อที่ในสคริปต์ยาว แต่ในกรณีนี้ฉันไม่เห็นว่ามันจะช่วยได้อย่างไร
Sergiy Kolodyazhnyy

2

นี่เป็นตัวเลือกที่ใช้cat -nกับการกำหนดหมายเลขอัตโนมัติ:

while read num line;do echo $num "&" $line;done <<<$(cat -n a.txt)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.