Como adicionar números de linha em cada linha usando o comando shell?


21

Meu arquivo,

PSS-A  (Primary A)
PSS-B  (Primary B)
PSS-C  (Primary C)
PSS-D  (Primary D)
PSS-E  (Primary E)
PSS-F  (Primary F)
PSS-G  (Primary G)
PSS-H  (Primary H)
PSS-I  (Primary I)
SPARE  (SPARE)

Arquivo de saída,

 1> PSS-A  (Primary A)
 2> PSS-B  (Primary B)
 3> PSS-C  (Primary C)
 4> PSS-D  (Primary D)
 5> PSS-E  (Primary E)
 6> PSS-F  (Primary F)
 7> PSS-G  (Primary G)
 8> PSS-H  (Primary H)
 9> PSS-I  (Primary I)
10> SPARE  (SPARE)

Respostas:


32

Se você deseja o mesmo formato que você especificou

awk '{print NR  "> " $s}' inputfile > outputfile

caso contrário, embora não seja padrão, a maioria das implementações do catcomando pode imprimir números de linhas para você (números preenchidos na largura 6 e seguidos por TAB em pelo menos as implementações GNU, busybox, Solaris e FreeBSD).

cat -n inputfile > outputfile

Ou você pode usar grep -n(números seguidos por :) com uma expressão regular ^que corresponda a qualquer linha:

grep -n '^' inputfile > outputfile

Sim ... ambos os comandos estão funcionando .... mas no catcomando está imprimindo os números das linhas ... mas não exatamente o que eu queria .... mas awk '{print NR "> " $s}' inputfile > outputfileme dá a saída desejada .... :-) @amit kumar
Pmaipmui

1
Observe também que cat -nnão é portátil. Somente a -uopção é especificada no POSIXcat .
vinc17

34

A ferramenta certa para este trabalho é nl:

nl -w2 -s'> ' file

Convém ajustar a wopção id de acordo com o número total de linhas no arquivo (se desejar que os números sejam bem alinhados).

Resultado:

 1> PSS-A  (Primary A)
 2> PSS-B  (Primary B)
 3> PSS-C  (Primary C)
 4> PSS-D  (Primary D)
 5> PSS-E  (Primary E)
 6> PSS-F  (Primary F)
 7> PSS-G  (Primary G)
 8> PSS-H  (Primary H)
 9> PSS-I  (Primary I)
10> SPARE  (SPARE)

2
nltrata linhas que contêm uma sequência de 1, 2 ou 3 \:seqüências de caracteres especialmente. Use -d $'\n'para evitar isso. Além disso, por padrão, ele não numera linhas vazias. Use -bapara numerar todas as linhas.
Stéphane Chazelas

@ StéphaneChazelas de fato, muito obrigado! Observe que a $'...'sintaxe é específica do bash.
myrdd

Meu coração afundou quando vi que seqnão fazia isso. Obrigado deus pornl
Sridhar Sarnobat

1
@myrdd, $'...'vem de ksh93 e também é suportado por zsh, mksh, sh busybox, sh FreeBSD e esmagar pelo menos. Ainda não é padrão, mas está planejado para inclusão na próxima versão principal do POSIX.
Stéphane Chazelas

@ StéphaneChazelas obrigado. para referência, há uma pergunta sobre $'...'portabilidade ( cotação
myrdd 19/02/19

0

eu fiz pelo método abaixo

comando: cat -n filename |sed -r "s/^\s+//g"| sed "s/^[0-9]*/&\> /g"

resultado

cat -n u.txt |sed -r "s/^\s+//g"| sed "s/^[0-9]*/&\> /g"
1>  PSS-A  (Primary A)
2>  PSS-B  (Primary B)
3>  PSS-C  (Primary C)
4>  PSS-D  (Primary D)
5>  PSS-E  (Primary E)
6>  PSS-F  (Primary F)
7>  PSS-G  (Primary G)
8>  PSS-H  (Primary H)
9>  PSS-I  (Primary I)
10>     SPARE  (SPARE)
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.