Làm cách nào để tăng bộ đếm dòng cho các thay thế bắt đầu dòng bằng AWK / Lỗi?


9

Đầu tiên tôi nghĩ về SED ( sed "s/^/COUNTER \&/" /tmp/1.tex) nhưng nó được thiết kế cho một dòng duy nhất và tôi không thể tự tăng bộ đếm bằng sed vì vậy bây giờ awktôi nghĩ vì tôi có những trải nghiệm tuyệt vời với gawkcác phương pháp tích hợp. Dữ liệu

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

Sản lượng dự kiến

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

HĐH: Debian 8,5

Câu trả lời:


11

nl là một tiện ích để đánh số các dòng của một tập tin. Công dụng:

nl /path/to/file

Trong trường hợp cụ thể của bạn:

$ 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àm thế nào bạn có thể kết hợp điều này với bộ đếm trước và dấu và? - - Nó hoạt động cho các quầy, nhưng không chắc chắn nếu cũng cho sau này.
Léo Léopold Hertz

3
nl -s ' &' /path/to/file. -schỉ định những gì tách các số từ phần thân của tệp đầu vào.
DopeGhoti

1
nlkhác với cat -nawkgiải pháp ở chỗ nó không đánh số các dòng trống theo mặc định
iruvar

10

Điều này đạt được những gì bạn đang theo đuổi. (cũng như vậy awk '$0=NR" & "$0' filename, nhưng đó là một chút khó hiểu)

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

Hoặc nếu sedthích hợp hơn, điều này cho kết quả tương tự.

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

perl cách tiếp cận.

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

Làm thế nào bạn tìm thấy cú pháp này sed = filename | ...? - - Tôi không biết rằng bạn có thể sử dụng sed với equalbiểu tượng. - - sedTuyên bố của bạn có thể làm việc trong môi trường năng động? Có điểm yếu nào không?
Léo Léopold Hertz

1
@ LéoLéopoldHertz Tôi đã xem trang con người, =nhà điều hành nằm trong phần "Lệnh Zero- hoặc Một địa chỉ".
Sergiy Kolodyazhnyy

Vâng, = Print the current line number. Vì vậy, tính năng này thực sự được tích hợp trong sed. Đẹp!
Léo Léopold Hertz

3

Python có thể là một công cụ thay thế tốt cho việc này:

$ 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

Cách thức hoạt động này là chúng tôi chuyển hướng văn bản vào stdin của python và đọc các dòng từ đó. enumerate()Hàm là số cho dòng đếm, với sys.stdinchỉ định là đầu vào và 1là chỉ mục bắt đầu. Phần còn lại rất đơn giản - chúng tôi tạo danh sách các chuỗi mới bằng cách truyền chỉ mục dưới dạng chuỗi được nối với nhau bằng ' & 'chuỗi và chính dòng đó. Cuối cùng, tất cả những gì được ghép lại từ danh sách thành một bài kiểm tra của ''.join()hàm.

Ngoài ra, đây là phiên bản nhiều dòng cho tệp tập lệnh hoặc đơn giản là để dễ đọc:

#!/usr/bin/env python
import sys

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

Hoạt động giống nhau:

$ ./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

Nhưng nếu bạn thích làm điều đó trong bash, thì điều đó cũng có thể được thực hiện:

$ 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 준영 Chà, nếu tôi làm điều đó mà không cần liệt kê, tôi sẽ cần một biến theo dõi số lượng dòng và tôi cần bắt đầu biến đó và tăng dần mỗi lần. Sử dụng enumerate()tiết kiệm tối đa 3 dòng mã. Nó rất hữu ích khi xử lý những thứ khác, như xử lý các mục trong danh sách. Xem docs.python.org/2/library/functions.html#enumerate
Sergiy Kolodyazhnyy

@ LéoLéopoldHertz nếu bạn hiểu cách sử dụng bộ đếm như tôi làm bash, thì cứ thoải mái sử dụng nó :) Tôi chỉ thấy từ kinh nghiệm enumerate()là thanh lịch hơn, nhưng đó chỉ là ý kiến ​​của tôi. Bằng mọi cách, hãy sử dụng phương pháp khác nếu bạn nghĩ nó rõ ràng hơn
Sergiy Kolodyazhnyy

OK, enumeraterõ ràng hơn khởi tạo biến. Biểu thức lambda có thể tiết kiệm một số không gian?
Léo Léopold Hertz

@ LéoLéopoldHertz Nó có thể tiết kiệm không gian trong một tập lệnh dài, nhưng trong trường hợp này, tôi chỉ không thấy làm thế nào có thể giúp đỡ.
Sergiy Kolodyazhnyy

2

Đây cũng là một tùy chọn sử dụng cat -nvới đánh số tự động:

while read num line;do echo $num "&" $line;done <<<$(cat -n a.txt)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.