Como adicionar números de linha personalizados em um arquivo

3

Eu quero acrescentar file2 a file1 . Antes de fazer isso, preciso adicionar um número de linha personalizado ao file2 .

file1

1 abc
2 bcd
3 efg

file2

mkh
dfd
aad
  1. Adicione o número da linha em file2 após file1 .

    4 mkh
    5 dfd    
    6 aad
    
  2. Anexar file2 a file1

    cat file2 >> file1
    

Como posso adicionar o número da linha em file2 mostrado acima?

    
por Leon 21.10.2016 / 21:26

4 respostas

3
nl -v "$((1+$(wc -l < file1)))" file2 >> file1

nl é uma ferramenta para n umber l ines de um arquivo. A opção -v fornece o valor inicial dos números de linha. Eu uso um subshell e wc para obter uma contagem de linha de file1 , e adiciono um a ele para obter o número da linha inicial para file2 e concateno os resultados no final de file1 .

Observe que wc -l file1 imprimiria a contagem de linha seguida do nome do arquivo, mas como redirecionamos o stdin de wc para vir de file1 , a própria ferramenta wc não sabe nada sobre o nome do arquivo para file1 e apenas imprime apenas a contagem de linhas (com alguns espaços em branco que não importam neste contexto).

Isso pode ser feito ligeiramente de forma mais limpa usando apenas awk e nl :

nl -v $(awk 'END { print NR + 1 }' file1) file2 >> file1
    
por 21.10.2016 / 21:51
2

com awk :

awk -v nl=$(wc -l <f1.txt) '{print NR+nl " " $0}' f2.txt
  • $(wc -l <f1.txt) obtém o número de linhas no arquivo f1.txt , estamos passando isso como nl variable para awk

  • print NR+nl " " $0 imprime cada registro de f2.txt com o número de linha correspondente adicionado à variável nl , depois um espaço e, em seguida, todo o registro

Exemplo:

% cat f1.txt 
1 abc
2 bcd
3 efg

% cat f2.txt 
mkh
dfd
aad

% awk -v nl=$(wc -l <f1.txt) '{print NR+nl " " $0}' f2.txt
4 mkh
5 dfd
6 aad
    
por 21.10.2016 / 21:57
2

Outra solução awk :

$ awk 'NF==1{print ++c" "$1 >> "file1"} NF>1{c=$1}' file1 file2
$ cat file1
1 abc
2 bcd
3 efg
4 mkh
5 dfd
6 aad


Caso genérico:

$ cat file1
1 abc x
2 bcd y
3 efg z
$ cat file2
mkh 1a
dfd foo
aad bar

$ awk 'NR==FNR{c=$1; next} {print ++c" "$0 >> "file1"}' file1 file2
$ cat file1
1 abc x
2 bcd y
3 efg z
4 mkh 1a
5 dfd foo
6 aad bar
    
por 22.10.2016 / 05:19
0

Uma resposta muito simples:

$ cat testText 
1. The quick brown fox jumped over the lazy dog.

$ cat testText | tr ' ' '\n' | sort >testText2

$ cat -n testText testText2
     1  1. The quick brown fox jumped over the lazy dog.
     2  1.
     3  brown
     4  dog.
     5  fox
     6  jumped
     7  lazy
     8  over
     9  quick
    10  the
    11  The
    
por 24.10.2016 / 20:23