FNR 및 NR 변수 문제

FNR 및 NR 변수 문제

두 개의 파일이 있습니다. 하나는 10개의 레코드가 있고 다른 하나는 15개의 레코드가 있습니다. 문제는 cat파일을 합칠 때 항상 작동한다는 것 입니다 FNR=NR.

예를 들어 다음 파일을 고려해보세요.

파일 1:

1,boo
2,foo
3,boo

파일 2:

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

다음 코드를 적용할 때:

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

결과는 다음과 같습니다.

1
2
3
1
2 
3
4

하지만 제가 실제로 가지고 있는 것은 FNR= 1부터 7까지입니다.

답변1

대신 이것을 사용하십시오:

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

awk의 변수는 FNR각 입력 파일의 레코드 수를 제공합니다. 그러나 cat .. | awkawk를 사용하여 stdin 파일 설명자를 읽으면 awk는 1개의 "파일"만 봅니다.

더 나은 이해를 위해 다음을 시도해 보십시오( FILENAME현재 처리 중인 파일을 사용하여).

$ 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

FILENAME첫 번째 예에서 볼 수 있듯이 두 번째 예 에는 표준 입력을 나타내는 2개의 파일이 처리되고 있습니다 -.

편집하다:다음 예를 참조하세요.

$ 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

먼저 awk는 stdin에서 읽습니다(이 cat file1부분은 awk에 대한 인수로도 사용됩니다 -). 그런 다음 일반적인 내용이 있습니다 . 마지막으로 awk가 읽는 파이프( )를 생성하는 부분이 file1있습니다 .<(cat file1)/dev/fd/63

답변2

이들을 cat연결( )하면 awk단 하나의 파일이 됩니다(이 경우 표준 입력). 원하는 결과를 얻으려면 대신 실행하십시오.

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

답변3

이것은 정확하지 않습니다. 파일을 캡처하여 파이프라인으로 보내면 더 이상 파일을 개별적으로 계산하지 않고 파이프라인의 모든 입력을 단일 파일로 가져옵니다.

관련 정보