Bagaimana saya bisa menambahkan nomor baris dan tab ke setiap baris file teks?

45

Bagaimana saya bisa menambahkan nomor baris dan tab ke awal setiap baris file teks?

Richard Hoskins
sumber
Apa yang saya bertanya-tanya adalah bagaimana Anda akan melakukannya pada Windows ...
21179 itsadok
4
Haruskah ini berada di stackoverflow? Untuk superuser, jawabannya adalah Notepad & banyak kesabaran.
Kokos
2
Jadi, apakah Anda ingin menambahkan atau menambahkan. Judul dan teks tubuh Anda berbeda;)
matpie
Saya kira saya ingin menambahkan ke awal , "hanya" menjadi kata untuk peretas.
Richard Hoskins
Di Windows, seperti pertanyaan pemrograman-ish lainnya, Anda dapat menginstal Cygwin dan kemudian menggunakan jawaban di bawah ini.
Jonathan Hartley

Jawaban:

49
awk '{printf "%d\t%s\n", NR, $0}' < filename
pgs
sumber
10
Atau awk '{print NR, "\t", $0}'.
jtbandes
1
jawaban di bawah ini, dengan baris perintah nl, adalah solusi yang jauh lebih sederhana.
Daniel Ribeiro
2
@DanielRibeiro lebih sederhana tetapi kurang dapat diandalkan dan kurang fleksibel.
Jonathan Hartley
@DanielRibeiro Jawaban yang digunakan nljuga SALAH. Dalam kode sumber, itu tidak akan pernah memberi Anda nomor baris yang benar, karena tidak menghitung baris hanya dengan spasi putih.
oligofren
@jtbandes Solusi Anda menambahkan spasi antara nomor baris dan tab (setidaknya di mac saya)
Yossi Vainshtein
55

Perintah nl harus melakukan ini, tetapi juga menambah spasi sebelum nomor baris. Itu bagian dari Linux coreutils.

nl lines.txt
 1  $bkWTN
 2  $cV8$.
ACoolie
sumber
4
Sebenarnya, Anda bisa mengatakan nluntuk menghilangkan spasi sebelum nomor. Cukup gunakan -w1opsi untuk memberi tahu itu lebar minimum untuk angka adalah 1.
cjm
2
Hati-hati bahwa 'nl' mengasumsikan secara default bahwa teks Anda dibagi menjadi 'halaman' dengan header dan footer, semua dibatasi oleh garis-garis seperti '\:' atau '\: \:' atau '\: \: \:'. Jika teks Anda memiliki baris seperti ini di dalamnya, maka 'nl' akan menghasilkan hasil yang tidak terduga, seperti menelan garis-garis itu, bagian tanpa penomoran, atau memulai kembali penomoran dari 1 di bagian. Gunakan -dXY (di mana XY adalah sepasang karakter yang tidak muncul sendiri pada teks Anda) untuk mencegah perilaku ini. Dalam kasus umum, ini mungkin sulit diprediksi, jadi saya sarankan menggunakan salah satu solusi lain di halaman ini.
Jonathan Hartley
Menggunakan '-w1' tidak hanya akan menghapus spasi setelah angka, tetapi juga akan memotong angka garis menjadi hanya satu karakter lebar, yang berarti nomor garis Anda hanya menampilkan digit paling signifikan mereka. Ini hampir pasti bukan yang Anda inginkan.
Jonathan Hartley
4
Dengan -nlnAnda dapat dibenarkan-kiri jika Anda tidak ingin spasi sebelum nomor baris. Juga, untuk menentukan pemisah tab Anda dapat menggunakan -s$'\t'atau -s' '(masukkan tab di antara tanda kutip tunggal dengan ctrl+vitu tab).
don_crissti
2
@JonathanHartley nl -w1(dari GNU coreutils 8.24) tidak memotong angka baris.
Skippy le Grand Gourou
10
sed = test.txt | sed 'N;s/\n/\t/'

Perintah "sed =" akan mencetak nomor baris diikuti dengan carriage return dan kemudian baris berikutnya.

Ekspresi "N; s / \ n / \ t /" akan mengambil setiap baris, dapatkan baris berikutnya (yaitu nomor baris dan baris), dan ganti carriage return dengan tab.

Callum
sumber
Mencetak "t" tanpa tab dengan versi sed saya: 8t Saya melihat pikiran terbaik dari generasi saya dihancurkan oleh kegilaan 9t, kelaparan telanjang histeris,
Richard Hoskins
1
Perhatikan bahwa \nini adalah umpan baris (biasanya disebut "baris baru", karena penggunaannya yang pertama tersebar luas di Unix), dan \rmerupakan carriage return. Penggunaan Windows \r\n(juga disebut sebagai CRLF).
Camilo Martin
(Yay nitpicking!)
Camilo Martin
Jika kita akan masuk ke nitpicking tentang bagaimana windows mungkin berbeda, maka kita mungkin perlu mempertimbangkan UTF16.
mc0e
4
cat -n <yourfile> | perl -pe "s/^\s*(\d+)\s+/\1\t/"

cat -n menambahkan linenumber sebagai "123 linecontents" dan regexp memodifikasinya menjadi "linenumberTABlinecontents"

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

atau

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

Bagaimana tentang

cat -n somefile.txt

?

innaM
sumber
1
Tanpa tab. (Komentar membutuhkan 15 karakter adalah persyaratan bodoh.)
Richard Hoskins
1
Ini menghasilkan tab pada sistem saya. cat (GNU coreutils) 6.10.
innaM
Di sistem saya, ia menambahkan baris (tab) nomor (spasi). Utilitas BSD.
Richard Hoskins
2

Oke, inilah solusi bash satu baris:

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

Pengaturan IFS pertama memberi tahu bash untuk membaca baris penuh pada satu waktu. Baris kedua me-reset IFS ke default.

Sebagai bonus tambahan, ini berjalan sepenuhnya di shell Anda dan tidak menjalankan program!

P. Heffner
sumber
1

Oke, karena kami sedang mengumpulkan cara untuk melakukan ini,

 grep -n . file.txt | sed 's/\(^[0-9]*\):/\1    /g'
 # this is a tab with Ctrl-V + Tab  =====>  ---- 
nik
sumber
Sekarang saya melihat ini. Oke, hapus posting saya sendiri. Apa? Anda mengatakan bahwa SU tidak membiarkan Anda menghapus posting Anda sendiri?
Kevin M
grep + sed == awk
Tadeusz A. Kadłubowski
1
sed file.txt -e 's/^/\t/' | cat -n | sed -e 's/^\t//'

atau untuk beberapa non-GNU sed:

cat file.txt | sed -e 's/^/\\t/' | cat -n | sed -e 's/^\\t//'
kekacauan
sumber
Mencetak "t" tanpa tab dengan versi sed saya.
Richard Hoskins
Diedit untuk meloloskan diri; coba seperti itu.
kekacauan
Jika semuanya gagal, tekan saja tab. :) (Atau ^ tab V jika shell Anda memberi Anda masalah dengan itu.)
chaos
sed: 1: "test.txt": label tidak jelas 'est.txt'
Richard Hoskins
'cat test.txt | sed -e 's / ^ / \\ t /' | cat -n 'mencetak (tab) nomor (spasi) \ t (baris)
Richard Hoskins