Làm cách nào tôi có thể thêm số dòng và tab cho mỗi dòng của tệp văn bản?


45

Làm cách nào để thêm số dòng và tab vào đầu mỗi dòng của tệp văn bản?


Điều tôi băn khoăn là làm thế nào bạn làm điều đó trên Windows ...
itadok

4
Điều này có nên trên stackoverflow? Đối với siêu người dùng, câu trả lời là Notepad và rất nhiều kiên nhẫn.
kokos

2
Vì vậy, bạn có muốn thêm hoặc nối thêm. Tiêu đề và văn bản cơ thể của bạn là khác nhau;)
matpie

Tôi đoán tôi muốn nối lại từ đầu , "trả trước" chỉ là một từ cho tin tặc.
Richard Hoskins

Trên Windows, như với bất kỳ câu hỏi lập trình nào khác, bạn có thể cài đặt Cygwin và sau đó sử dụng các câu trả lời bên dưới.
Jonathan Hartley

Câu trả lời:


49
awk '{printf "%d\t%s\n", NR, $0}' < filename

10
Hoặc awk '{print NR, "\t", $0}'.
jtbandes

1
Trả lời dưới đây, với dòng lệnh nl, là một giải pháp đơn giản hơn nhiều.
Daniel Ribeiro

2
@DanielRibeiro đơn giản hơn nhưng kém tin cậy và kém linh hoạt.
Jonathan Hartley

@DanielRibeiro Câu trả lời sử dụng nlcũng SAI. Trong mã nguồn, nó sẽ không bao giờ cung cấp cho bạn số dòng đúng, vì nó không đếm các dòng chỉ có khoảng trắng.
oligofren

@jtbandes Giải pháp của bạn thêm khoảng trắng giữa số dòng và tab (ít nhất là trên máy mac của tôi)
Yossi Vainshtein

55

Lệnh nl nên làm điều này, nhưng nó cũng thêm không gian trước số dòng. Nó là một phần của lõi Linux.

nl lines.txt
 1  $bkWTN
 2  $cV8$.

4
Trên thực tế, bạn có thể nói nlbỏ qua khoảng trắng trước số. Chỉ cần sử dụng -w1tùy chọn để cho nó biết chiều rộng tối thiểu cho một số là 1.
cjm

2
Cảnh giác rằng 'nl' mặc định giả định rằng văn bản của bạn được chia thành 'trang' với các tiêu đề và chân trang, tất cả được phân cách bằng các dòng như '\:' hoặc '\: \:' hoặc '\: \: \:'. Nếu văn bản của bạn có bất kỳ dòng nào như thế này, thì 'nl' sẽ tạo ra kết quả không mong muốn, chẳng hạn như nuốt những dòng đó, các phần không có đánh số hoặc khởi động lại đánh số từ 1 trong một phần. Sử dụng -dXY (trong đó XY là một cặp ký tự không xuất hiện trên một dòng trong văn bản của bạn) để ngăn chặn hành vi này. Trong trường hợp chung, điều này có thể khó dự đoán, vì vậy tôi khuyên bạn nên sử dụng một trong những giải pháp khác trên trang này.
Jonathan Hartley

Sử dụng '-w1' sẽ không chỉ xóa khoảng trắng sau các số mà còn cắt bớt các số dòng thành chỉ rộng một ký tự, nghĩa là số dòng của bạn chỉ hiển thị chữ số có nghĩa ít nhất. Điều này gần như chắc chắn không phải là những gì bạn muốn.
Jonathan Hartley

4
Với -nlnbạn có thể chứng minh trái nếu bạn không muốn (các) khoảng trắng trước số dòng. Ngoài ra, để chỉ định dấu phân cách tab bạn có thể sử dụng -s$'\t'hoặc -s' '(chèn một tab giữa các dấu ngoặc đơn ctrl+vsau đó tab).
don_crissti

2
@JonathanHartley nl -w1(từ GNU coreutils 8.24) không cắt bớt số dòng.
Skippy le Grand Gourou

10
sed = test.txt | sed 'N;s/\n/\t/'

Lệnh "sed =" sẽ in số dòng theo sau là dòng trở lại và sau đó là dòng tiếp theo.

Biểu thức "N; s / \ n / \ t /" sẽ lấy từng dòng, lấy dòng tiếp theo (tức là số dòng và dòng) và thay thế trả về vận chuyển bằng một tab.


In một "t" không có tab với phiên bản của tôi về sed: 8t tôi thấy tâm trí tốt nhất của thế hệ chúng tôi bị phá hủy bởi 9t điên rồ, đói cuồng loạn khỏa thân,
Richard Hoskins

1
Lưu ý rằng đó \nlà nguồn cấp dữ liệu (thường được gọi là "dòng mới", vì việc sử dụng rộng rãi đầu tiên của nó là trong Unix) và \rlà vận chuyển trở lại. Windows sử dụng \r\n(còn được gọi là CRLF).
Camilo Martin

(Yay nitpicking!)
Camilo Martin

Nếu chúng ta sẽ hiểu về cách các cửa sổ có thể khác nhau, thì chúng ta có thể cần phải xem xét UTF16.
mc0e

4
cat -n <yourfile> | perl -pe "s/^\s*(\d+)\s+/\1\t/"

cat -n thêm vải lanh là "123 linecontents" và regrec đó sửa đổi nó thành "linenumberTABlinecontents"


3
perl -pe "s/^/$.\t$_/" file.txt

hoặc là

perl -ne "print qq($.\t$_)" file.txt

2

Làm thế nào về

cat -n somefile.txt

?


1
Không có tab. (Nhận xét cần 15 ký tự là một yêu cầu ngu ngốc.)
Richard Hoskins

1
Điều này tạo ra các tab trên hệ thống của tôi. con mèo (GNU coreutils) 6.10.
innaM

Trên hệ thống của tôi, nó thêm dòng (tab) số (dấu cách). Sử dụng BSD.
Richard Hoskins

2

OK, đây là một giải pháp bash một dòng:

$ IFS=$'\n';x=1;for l in $(<file.txt);do echo -e "$x\t$l";((x+=1));done
$ IFS=

Cài đặt IFS đầu tiên cho bash đọc một dòng đầy đủ tại một thời điểm. Dòng thứ hai đặt lại IFS về mặc định.

Là một phần thưởng bổ sung, nó chạy hoàn toàn trong vỏ của bạn và không thực hiện chương trình!


1

Ok, vì chúng tôi đang thu thập các cách để làm điều này,

 grep -n . file.txt | sed 's/\(^[0-9]*\):/\1    /g'
 # this is a tab with Ctrl-V + Tab  =====>  ---- 

Bây giờ tôi thấy điều này. OK, xóa bài viết của riêng tôi. Gì? Bạn nói rằng SU không cho phép bạn xóa bài viết của mình?
Kevin M

grep + sed == awk
Tadeusz A. Kadłubowski

1
sed file.txt -e 's/^/\t/' | cat -n | sed -e 's/^\t//'

hoặc đối với một số người không phải GNU sed:

cat file.txt | sed -e 's/^/\\t/' | cat -n | sed -e 's/^\\t//'

In một "t" không có tab với phiên bản sed của tôi.
Richard Hoskins

Chỉnh sửa để thoát kép; Hãy thử nó như thế.
hỗn loạn

Nếu vẫn thất bại, chỉ cần nhấn tab. :) (Hoặc ^ V nếu vỏ của bạn gây rắc rối với điều đó.)
hỗn loạn

sed: 1: "test.txt": nhãn không xác định 'est.txt'
Richard Hoskins

'mèo test.txt | sed -e 's / ^ / \\ t /' | cat -n 'in (tab) số (dấu cách) \ t (dòng)
Richard Hoskins
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.