Programa shell que lê linhas e linhas de saída com os números de linha

3

Eu preciso escrever um programa que leia linhas de um arquivo em stdin e escreva as linhas em stdout com números de linha. Eu não posso usar cat -n .

Digamos que o arquivo de texto tenha isto:

 abcdef
 ghi

 klm
 nopqr st

Basicamente, deve ler essas linhas e produzir essas linhas, mas com números de linhas.

Este é o loop de leitura enquanto eu tenho, mas ele não imprime todas as linhas.

while read line
do
    awk '{print NR, $0}'

done < file

Basicamente, o que esta saída é esta:

1 ghi
2 
3 klm
4 nopqr   st

Por alguma razão, o abcdef não aparece e o número 2 não deve ficar em branco.

    
por shawn edward 27.02.2016 / 08:04

4 respostas

8

Você já tentou nl -b a <file_name>

debian@virt00:~/test$ nl -b a file
     1  abcdef
     2   ghi
     3
     4   klm
     5   nopqr st
debian@virt00:~/test$
  • nl significa linha numérica
  • -b sinalizador para numeração de corpo
  • 'a' para todas as linhas.

para mais informações link

    
por 27.02.2016 / 08:52
3
awk '$0!=""{print NR, $0}' file

O $0 != "" significa $0 not equal para vazio. Para essas linhas, imprima o número e a linha da linha.

Isso produzirá essa saída:

1 abcdef
2 ghi
4 klm
5 nopqr st

com os números de linha antigos. Se você precisar da saída com os novos números de linha:

awk '$0!=""{a++; print a, $0}' file
1 abcdef
2 ghi
3 klm
4 nopqr st

Para explicar como seu script funcionou:

A linha com read line lerá a primeira linha (você não a imprime).
Em seguida, você conecta o arquivo a awk e processa todas as outras linhas.
Awk não (por padrão) evita linhas vazias, então a linha vazia também é impressa.

Existem muitas maneiras de resolver isso, a que está acima parece tão simples quanto possível.

    
por 27.02.2016 / 08:47
2

Você pode usar "cat -n", flag "-n" para adicionar os números às linhas de saída de "cat".

    
por 27.02.2016 / 08:19
-1
#!/bin/bash

awk '!/^$/{print ++a, $0}' file

echo

awk '!!$0{print ++a, $0}' file

echo

awk '{if ($0 != "") print ++aa, $0}' file

echo

NR=0
while read -r
do
    [[ "${REPLY}" = "" ]] || echo $((++NR)) "${REPLY}"
done < file

echo
    
por 10.01.2018 / 17:59