[awk] NR 및 FNR은 무엇이며 “NR == FNR”은 무엇을 의미합니까?

.NET을 사용하여 파일 비교를 배우고 있습니다 awk.

아래와 같은 구문을 찾았습니다.

awk 'NR==FNR{a[$1];next}$1 in a{print $1}' file1 file2

NR==FNR이것 의 의미가 무엇인지 이해할 수 없었 습니까? 내가 시도 FNR==NR하면 동일한 출력을 얻습니까?

정확히 무엇을합니까?



답변

awk FNR에서 현재 파일의 레코드 번호 (일반적으로 줄 번호)를 NR참조하고 총 레코드 번호를 나타냅니다. 연산자 ==는 두 개의 주변 피연산자가 같을 때 true를 반환하는 비교 연산자입니다.

NR==FNR, FNR각 파일의 첫 번째 줄에 대해 다시 1 로 재설정되지만 NR계속 증가 하므로 첫 번째 파일에 대해서만 조건 이 참 임을 의미합니다 .

이 패턴은 일반적으로 첫 번째 파일에서만 작업을 수행하는 데 사용됩니다. next가 첫 번째 이외의 파일에서 실행되도록 더 명령을 건너 뜁니다 블록 수단 내부.

조건 FNR==NR은 동일한 두 피연산자를와 비교 NR==FNR하므로 동일한 방식으로 작동합니다.


답변

file1에도있는 file2에서 키 (행의 첫 번째 단어)를 찾습니다.
1 단계 : 배열 a를 파일 1의 첫 단어로 채 웁니다.

awk '{a[$1];}' file1

2 단계 : 동일한 명령에서 배열 a를 채우고 파일 2를 무시합니다. 이를 위해 현재 입력 파일의 번호로 지금까지 총 레코드 수를 확인하십시오.

awk 'NR==FNR{a[$1]}' file1 file2

3 단계 : }파일 1을 구문 분석 할 때 발생할 수있는 작업 무시

awk 'NR==FNR{a[$1];next}' file1 file2

4 단계 : 배열 a에서 발견되면 file2의 키 인쇄

awk 'NR==FNR{a[$1];next} $1 in a{print $1}' file1 file2


답변

조회 NRFNRAWK 설명서에서 다음 조건이 무엇인지 스스로에게 물어 어떤에서 NR==FNR다음 예제 :

$ cat file1
a
b
c

$ cat file2
d
e

$ awk '{print FILENAME, NR, FNR, $0}' file1 file2
file1 1 1 a
file1 2 2 b
file1 3 3 c
file2 4 1 d
file2 5 2 e


답변

가 있습니다 awk내장 변수.

NR -처리 된 총 레코드 수를 제공합니다.

FNR -각 입력 파일에 대한 총 레코드 수를 제공합니다.


답변

파일 a.txt 및 b.txt가 있다고 가정합니다.

cat a.txt
a
b
c
d
1
3
5
cat b.txt
a
1
2
6
7

NR 및 FNR은 awk 기본 제공 변수입니다. NR-처리 된 총 레코드 수를 제공합니다. (이 경우 a.txt 및 b.txt 모두) FNR-각 입력 파일에 대한 총 레코드 수를 제공합니다 (a.txt 또는 b.txt의 레코드).

awk 'NR==FNR{a[$0];}{if($0 in a)print FILENAME " " NR " " FNR " " $0}' a.txt b.txt
a.txt 1 1 a
a.txt 2 2 b
a.txt 3 3 c
a.txt 4 4 d
a.txt 5 5 1
a.txt 6 6 3
a.txt 7 7 5
b.txt 8 1 a
b.txt 9 2 1

NR == FNR과 일치하는 첫 번째 항목을 건너 뛰려면 “next”추가

b.txt 및 a.txt

awk 'NR==FNR{a[$0];next}{if($0 in a)print FILENAME " " NR " " FNR " " $0}' a.txt b.txt
b.txt 8 1 a
b.txt 9 2 1

b.txt에는 있지만 a.txt에는 없습니다.

 awk 'NR==FNR{a[$0];next}{if(!($0 in a))print FILENAME " " NR " " FNR " " $0}' a.txt b.txt
b.txt 10 3 2
b.txt 11 4 6
b.txt 12 5 7

awk 'NR==FNR{a[$0];next}!($0 in a)' a.txt b.txt
2
6
7


답변