Problema de variáveis FNR e NR

2

Eu tenho dois arquivos, um deles tem 10 registros e o outro com 15 registros, o problema é quando eu os cat juntos, sempre FNR=NR .

Por exemplo, considere os arquivos abaixo:

Arquivo1:

1,boo
2,foo
3,boo

Arquivo2:

1,boo
2,foo
3,boo
4,foo

Ao aplicar o seguinte código:

cat File1 File2 | awk -F, '{print FNR}'

O resultado deve ser:

1
2
3
1
2 
3
4

Mas o que eu realmente tenho é que FNR = 1 a 7.

    
por Eng7 27.08.2015 / 17:26

3 respostas

5

Use isso:

awk -F, '{print FNR}' file1 file2

A variável FNR no awk fornece o número de registros para cada arquivo de entrada. Mas, quando você usa cat .. | awk awk lê o descritor de arquivo stdin, portanto o awk vê apenas 1 "arquivo".

Tente entender melhor ( FILENAME contém o arquivo atual sendo processado):

$ awk -F, '{print FILENAME" "FNR}' file1 file2
file1 1
file1 2
file1 3
file2 1
file2 2
file2 3
file2 4
$ cat file1 file2 | awk -F, '{print FILENAME" "FNR}'
- 1
- 2
- 3
- 4
- 5
- 6
- 7

Como você pode ver no primeiro exemplo, há dois arquivos sendo processados, no segundo exemplo o FILENAME é - , indicando a entrada padrão.

Editar: Veja o seguinte exemplo:

$ cat file1 | awk -F, '{print FILENAME" "FNR}' - file1 <(cat file1)
- 1
- 2
- 3
file1 1
file1 2
file1 3
/dev/fd/63 1
/dev/fd/63 2
/dev/fd/63 3

Primeiro, o awk lê a partir do stdin (a parte cat file1 , também como um parâmetro - to awk). Então o regular file1 . Finalmente, a parte <(cat file1) , que cria um canal ( /dev/fd/63 ), de onde o awk lê.

    
por 27.08.2015 / 17:33
3

Você concatena ( cat ) eles juntos, então para awk é apenas um arquivo (ou entrada padrão neste caso). Se você quer que o resultado desejado seja executado,

 awk -F, '{print FNR}' File1 File2
    
por 27.08.2015 / 17:32
1

Isso não está correto. Quando você filma os arquivos e os envia para o pipe, ele não está mais contando os arquivos separadamente, ele está apenas obtendo todas as entradas do pipe como um único arquivo.

    
por 27.08.2015 / 17:36