Metin dosyasının her satırına satır numarası ve sekme nasıl hazırlayabilirim?


45

Bir metin dosyasının her satırının başına satır numarası ve sekme ekleyebilir miyim?


Ne merak ediyorum Windows üzerinde yapardım nasıl ...
itsadok

4
Bu yığın akışında mı olmalı? Süper kullanıcı için cevap Not Defteri ve sabrınız.
kokos,

2
Öyleyse, hazırlamak veya eklemek ister misin? Başlığınız ve beden metinleriniz farklı;)
matpie

Sanırım , hackerlara sadece bir kelime olmak için "hazırla" yı baştan eklemek istiyorum .
Richard Hoskins

Windows'ta, başka herhangi bir programlama sorusunda olduğu gibi, Cygwin'i yükleyebilir ve ardından aşağıdaki cevapları kullanabilirsiniz.
Jonathan Hartley

Yanıtlar:


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

10
Veya awk '{print NR, "\t", $0}'.
jtbandes

1
Aşağıda cevap, nl komut satırı ile çok daha basit bir çözümdür.
Daniel Ribeiro

2
@DanielRibeiro daha basit ancak daha az güvenilir ve daha az esnek.
Jonathan Hartley

@DanielRibeiro kullanarak cevap nlda yanlıştır. Kaynak kodda, yalnızca boşluk içeren satırları saymadığından size asla doğru satır numaralarını vermez.
oligofren

@jtbandes Çözümünüz satır numarası ve sekme arasına boşluk ekler (en azından
mac'umda

55

Nl komutu bunu yapmalıdır, ancak satır numarasından önce de boşluk ekler. Linux coreutils'in bir parçası.

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

4
Aslında, nlsayıdan önce boş bırakmamızı söyleyebilirsiniz . Sadece -w1bir sayı için minimum genişlik 1 olduğunu söylemek seçeneğini kullanın.
cjm

2
'Nl'nin varsayılan olarak, metninizin' \: 'veya' \: \: 'veya' \: \: \: 'gibi satırlarla sınırlandırılmış üst ve altbilgilerle' sayfalara 'ayrıldığını varsaydığını unutmayın. Metninizde bunun gibi bir satır varsa, 'nl', bu satırları yutmak, numaralandırılmamış bölümler veya numaralandırmayı bir bölümdeki 1'den yeniden başlatmak gibi beklenmeyen sonuçlar üretecektir. Bu davranışı önlemek için -dXY kullanın (burada XY, metninizde bir satırda oluşmayan bir çift karakterdir). Genel durumda, bunu tahmin etmek zor olabilir, bu yüzden bu sayfadaki diğer çözümlerden birini kullanmanızı öneririm.
Jonathan Hartley

'-W1' kullanmak, sayılardan sonraki boşluğu kaldırmakla kalmaz, aynı zamanda satır numaralarını yalnızca bir karakter genişliğinde keser , yani satır sayılarınız yalnızca en az önemli basamağını gösterir. Bu neredeyse kesinlikle istediğin şey değil.
Jonathan Hartley

4
İle -nlnşunları yapabilirsiniz satır numaraları önce boşluk (lar) istemiyorsanız sol haklı. Ayrıca, kullanabileceğiniz bir sekme ayırıcı belirtmek için -s$'\t'veya -s' '( ctrl+vardından tek tırnak işaretleri arasına bir sekme ekleyin tab).
don_crissti

2
@JonathanHartley nl -w1(GNU 8.24 coreutils itibaren) yok değil satır numaralarını kesecek.
Skippy le Grand Gourou,

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

"Sed =" komutu satır numarasını ve ardından satırbaşını yazdıktan sonra bir sonraki satırı yazacaktır.

"N; s / \ n / \ t /" ifadesi her satırı alır, bir sonraki satırı alır (yani, satır numarası ve satır) ve satırbaşını bir sekmeyle değiştirir.


Sed versiyonuyla sekmesiz bir "t" basıyor: 8t Neslimin en iyi beyinlerinin 9t delilik tarafından yok edilip, histerik çıplak aç
Richard Hoskins

1
Not \n(ilk yaygın kullanımı Unix içinde olduğu için, yaygın olarak sadece "satır" olarak adlandırılır) satır besleme ve \rsatır başı olduğunu. Windows kullanır \r\n(ayrıca denir CRLF).
Camilo Martin,

(Yay nitpicking!)
Camilo Martin

Pencerelerin nasıl farklı olabileceği konusunda nitpicking yapacaksak, UTF16'yı düşünmemiz gerekebilir.
mc0e

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

cat -n, linenumbers karakterini "123 linecontents" olarak ekler ve regexp "linenumberTABlinecontents" olarak değiştirir.


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

veya

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

2

Peki ya

cat -n somefile.txt

?


1
Sekme yok. (15 karaktere ihtiyaç duyan yorumlar aptalca bir gerekliliktir.)
Richard Hoskins

1
Bu sistemimde sekmeler üretir. cat (GNU coreutils) 6.10.
innaM

Sistemimde, (sekme) sayı (boşluk) satırı ekler. BSD Araçları.
Richard Hoskins

2

Tamam, İşte tek satırlık bir bash çözümü:

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

İlk IFS ayarı bash'e aynı anda tam bir satır okumasını söyler. İkinci satır, IFS'yi varsayılana sıfırlar.

Ek bir avantaj olarak, tamamen kabuğunuzda çalışır ve bir program yürütmez!


1

Tamam, bunu yapmanın yollarını topladığımızdan,

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

Şimdi bunu görüyorum. Tamam, kendi gönderimi sil. Ne? SU'nun kendi gönderinizi silmenize izin vermediğini mi söylüyorsunuz?
Kevin M

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

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

veya bazı GNU olmayanlar için sed:

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

Sed sürümümde sekme olmayan bir "t" yazdırır.
Richard Hoskins

Çift kaçış için düzenlendi; böyle dene.
kaos

Her şey başarısız olursa, sekmeye basmanız yeterlidir. :) (Kabuğunuz size bu konuda sorun çıkarırsa Veya ^ V sekmesi.)
kaos

sed: 1: "test.txt": tanımsız etiket 'est.txt'
Richard Hoskins

'cat test.txt | sed -e 's / ^ / \\ t /' | cat -n 'basıyor (sekme) sayı (boşluk) \ t (satır)
Richard Hoskins
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.