Como posso acrescentar um número de linha e uma guia a cada linha de um arquivo de texto?

45

Como posso acrescentar um número de linha e uma guia ao início de cada linha de um arquivo de texto?

Richard Hoskins
fonte
O que eu estou querendo saber é como você faria no Windows ...
itsadok
4
Isso deve estar no stackoverflow? Para superusuário, a resposta é o bloco de notas e muita paciência.
22610
2
Então, você deseja anexar ou anexar. Seus título e no corpo textos são diferentes;)
matpie
Acho que quero acrescentar ao início , "prefixar" sendo apenas uma palavra para hackers.
Richard Hoskins
No Windows, como em qualquer outra questão de programação, você pode instalar o Cygwin e, em seguida, usar as respostas abaixo.
Jonathan Hartley

Respostas:

49
awk '{printf "%d\t%s\n", NR, $0}' < filename
pgs
fonte
10
Or awk '{print NR, "\t", $0}'.
jtbandes
1
A resposta abaixo, com a linha de comando nl, é uma solução muito mais simples.
Daniel Ribeiro
2
@DanielRibeiro mais simples, mas menos confiável e menos flexível.
Jonathan Hartley
@DanielRibeiro A resposta usando nltambém é ERRADA. No código fonte, ele nunca fornecerá os números de linha corretos, pois não conta linhas apenas com espaço em branco.
Oligofren
@jtbandes Sua solução adiciona espaços entre o número da linha e a guia (pelo menos no meu mac)
Yossi Vainshtein 18/06/06
55

O comando nl deve fazer isso, mas também adiciona espaço antes do número da linha. Faz parte dos coreutils do Linux.

nl lines.txt
 1  $bkWTN
 2  $cV8$.
ACoolie
fonte
4
Na verdade, você pode dizer nlpara omitir o espaço antes do número. Basta usar a -w1opção de indicar a largura mínima para um número é 1.
CJM
2
Observe que 'nl' assume por padrão que seu texto é dividido em 'páginas' com cabeçalhos e rodapés, todos delimitados por linhas como '\:' ou '\: \:' ou '\: \: \:'. Se o seu texto tiver linhas como essa, 'nl' produzirá resultados inesperados, como engolir essas linhas, seções sem numeração ou reiniciar a numeração de 1 em uma seção. Use -dXY (onde XY é um par de caracteres que não ocorrem em uma linha por si mesmos no seu texto) para evitar esse comportamento. No caso geral, isso pode ser difícil de prever, portanto, recomendo usar uma das outras soluções nesta página.
Jonathan Hartley
Usar '-w1' não apenas removerá o espaço após os números, mas também truncará os números das linhas para que tenham apenas um caractere de largura, o que significa que os números das linhas exibem apenas o dígito menos significativo. Isso quase certamente não é o que você deseja.
Jonathan Hartley
4
Com -nlnvocê, você pode justificar à esquerda se não quiser o espaço (s) antes dos números das linhas. Além disso, para especificar um separador separador de você poderia usar -s$'\t'ou -s' '(inserir uma tabulação entre aspas simples com ctrl+ventão tab).
181114 Don
2
@JonathanHartley nl -w1(do GNU coreutils 8.24) não trunca os números de linha.
Skippy le Grand Gourou
10
sed = test.txt | sed 'N;s/\n/\t/'

O comando "sed =" imprimirá o número da linha seguido por um retorno de carro e depois a próxima linha.

A expressão "N; s / \ n / \ t /" pega cada linha, obtém a próxima linha (ou seja, número da linha e a linha) e substitui o retorno de carro por uma tabulação.

Callum
fonte
Imprime um "t" sem guia com a minha versão do sed: 8t Eu vi os expoentes da minha geração destruídos pela loucura T9, morrendo de fome, histéricos, nus,
Richard Hoskins
1
Observe que \né um feed de linha (normalmente chamado de "nova linha", desde que seu primeiro uso generalizado foi no Unix) e \ré um retorno de carro. Usos do Windows \r\n(também conhecido como CRLF).
Camilo Martin
(Yay nitpicking!)
Camilo Martin
Se entrarmos em detalhes sobre como as janelas podem ser diferentes, talvez seja necessário considerar o UTF16.
Mc0e
4
cat -n <yourfile> | perl -pe "s/^\s*(\d+)\s+/\1\t/"

cat -n adiciona roupa de banho como "123 itens de linha" e que o regexp o modifica para "roupa de númeroTABlinés"

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

ou

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

E se

cat -n somefile.txt

?

innaM
fonte
1
Sem guia. (Comentários necessitam de 15 caracteres é uma exigência estúpida.)
Richard Hoskins
1
Isso produz abas no meu sistema. gato (GNU coreutils) 6.10.
21129 innaM
No meu sistema, ele adiciona a linha do número (guia) (espaço). BSD Utils.
Richard Hoskins
2

OK, aqui está uma solução de bash de uma linha:

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

A primeira configuração do IFS informa ao bash para ler uma linha completa de cada vez. A segunda linha redefine o IFS para o padrão.

Como um bônus adicional, ele roda completamente no seu shell e não executa um programa!

P. Heffner
fonte
1

Ok, já que estamos coletando maneiras de fazer isso,

 grep -n . file.txt | sed 's/\(^[0-9]*\):/\1    /g'
 # this is a tab with Ctrl-V + Tab  =====>  ---- 
nik
fonte
Agora eu vejo isso. OK, exclua minha própria postagem. O que? Você diz que SU não permite excluir sua própria postagem?
Kevin M
grep + sed == awk
Tadeusz A. Kadłubowski
1
sed file.txt -e 's/^/\t/' | cat -n | sed -e 's/^\t//'

ou para alguns não-GNU seds:

cat file.txt | sed -e 's/^/\\t/' | cat -n | sed -e 's/^\\t//'
caos
fonte
Imprime um "t" sem tabulação na minha versão do sed.
Richard Hoskins
Editado para escape duplo; tente assim.
caos
Se tudo mais falhar, basta clicar na guia. :) (Ou ^ guia V se o seu shell dá-lhe problemas com isso.)
caos
sed: 1: "test.txt": rótulo indefinido 'est.txt'
Richard Hoskins
'cat test.txt | sed -e 's / ^ / \\ t /' | -n gato' prints (guia) número (espaço) \ t (linha)
Richard Hoskins