Satır başlangıcı değiştirmeleri için satır sayacını AWK /… ile nasıl arttırabilirim?


9

İlk önce SED ( sed "s/^/COUNTER \&/" /tmp/1.tex) hakkında düşündüm ama tek bir çizgi için tasarlandı ve şimdi sayacı kendisini düşünerek arttıramıyorum, bu yüzden şimdi entegre yaklaşımlarda awkbüyük deneyimlerim var gawk. Veri

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

Beklenen çıktı

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

İşletim Sistemi: Debian 8.5

Yanıtlar:


11

nl bir dosyanın satırlarını numaralandırmak için bir yardımcı programdır.

nl /path/to/file

Özel durumunuzda:

$ 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

Bunu hazır bekleyen sayaç ve ve işareti ile nasıl birleştirebilirsiniz? - - Sayaç için çalışır, ancak ikincisi için de emin değilim.
Léo Léopold Hertz 준영

3
nl -s ' &' /path/to/file. -ssayıları girdi dosyasının gövdesinden ayıranları belirtir.
DopeGhoti

1
nlvarsayılan olarak boş satırları numaralamaması cat -nve awkçözümünden farklıdır
iruvar

10

Bu, peşinde olduğunuz şeyi başarır. (olduğu gibi awk '$0=NR" & "$0' filename, ama bu biraz şifreli)

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

Veya sedtercih edilirse , bu aynı sonucu verir.

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

perl yaklaşımlar.

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

Bu sözdizimini nasıl buldunuz sed = filename | ...? - - sed equalsembolüyle kullanabileceğinizi bilmiyordum . - - İfadeniz seddinamik ortamlarda çalışabilir mi? Herhangi bir zayıflık var mı?
Léo Léopold Hertz 준영

1
@ LéoLéopoldHertz man Man sayfasının altına baktım, =operatör "Sıfır- veya Tek Adresli Komutlar" bölümünde.
Sergiy Kolodyazhnyy

Evet = Print the current line number,. Bu özellik aslında sed'de yerleşiktir. Güzel!
Léo Léopold Hertz 준영

3

Python bunun için iyi bir alternatif araç olabilir:

$ 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

Bunun çalışma şekli, metni python'un stdinine yönlendirip oradan satırları okumanızdır. enumerate()işlevi sys.stdingirdi olarak belirtilmiş satır 1başlangıcını verir ve başlangıç ​​dizinidir. Gerisi basit - dizeyi dize ile birleştirilen ' & 'dize ve satırın kendisi olarak döküm yaparak yeni dizelerin listesini oluşturuyoruz . Son olarak, listeden yeniden birleştirilen her şey ''.join()fonksiyon tarafından bir test haline getirilir .

Alternatif olarak, bir komut dosyası veya yalnızca okunabilirlik için çok satırlı bir sürüm:

#!/usr/bin/env python
import sys

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

Aynı şekilde çalışır:

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

Ama bunu bash'da yapmayı tercih ederseniz, bu da yapılabilir:

$ 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 준영 Eğer bunu numaralandırmadan yapsaydım, satır sayısını izleyen bir değişkene ihtiyacım olurdu ve bu değişkeni başlatmam ve her seferinde artmam gerekiyor. Kullanmak enumerate()3 satır kod gibi kaydeder. Listelerdeki öğeleri işlemek gibi başka şeylerle uğraşırken kullanışlıdır. Bkz. Docs.python.org/2/library/functions.html#enumerate
Sergiy Kolodyazhnyy

@ LéoLéopoldHertz counter sayacı bashörnekte yaptığım gibi anlıyorsanız , bunu kullanmaktan çekinmeyin :) Deneyimden enumerate()daha zarif buldum , ama bu sadece benim düşüncem.
Sergiy Kolodyazhnyy

Tamam, enumeratedeğişken örneklemeden daha açıktır. Lambda ifadesi biraz yerden tasarruf edebilir mi?
Léo Léopold Hertz 준영

@ LéoLéopoldHertz 준영 Uzun bir senaryoda yer kazanabilir, ancak bu durumda bunun nasıl yardımcı olabileceğini göremiyorum.
Sergiy Kolodyazhnyy

2

Bu, cat -notomatik numaralandırma ile kullanılan bir seçenektir :

while read num line;do echo $num "&" $line;done <<<$(cat -n a.txt)
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.