.NET을 사용하여 파일 비교를 배우고 있습니다 awk
.
아래와 같은 구문을 찾았습니다.
awk 'NR==FNR{a[$1];next}$1 in a{print $1}' file1 file2
NR==FNR
이것 의 의미가 무엇인지 이해할 수 없었 습니까? 내가 시도 FNR==NR
하면 동일한 출력을 얻습니까?
정확히 무엇을합니까?
.NET을 사용하여 파일 비교를 배우고 있습니다 awk
.
아래와 같은 구문을 찾았습니다.
awk 'NR==FNR{a[$1];next}$1 in a{print $1}' file1 file2
NR==FNR
이것 의 의미가 무엇인지 이해할 수 없었 습니까? 내가 시도 FNR==NR
하면 동일한 출력을 얻습니까?
정확히 무엇을합니까?
Two-file Processing
에 backreference.org/2010/02/10/idiomatic-awk
답변:
awk FNR
에서 현재 파일의 레코드 번호 (일반적으로 줄 번호)를 NR
참조하고 총 레코드 번호를 나타냅니다. 연산자 ==
는 두 개의 주변 피연산자가 같을 때 true를 반환하는 비교 연산자입니다.
즉 NR==FNR
, FNR
각 파일의 첫 번째 줄에 대해 다시 1 로 재설정되지만 NR
계속 증가 하므로 첫 번째 파일에 대해서만 조건 이 참 임을 의미합니다 .
이 패턴은 일반적으로 첫 번째 파일에서만 작업을 수행하는 데 사용됩니다. next
가 첫 번째 이외의 파일에서 실행되도록 더 명령을 건너 뜁니다 블록 수단 내부.
조건 FNR==NR
은 동일한 두 피연산자를와 비교 NR==FNR
하므로 동일한 방식으로 작동합니다.
a='3x'; if [[ $a == 3* ]]; then echo yes; fi
당신은 양쪽을 전환 할 수 없습니다 ==
.
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
;next
이상한 추가입니다 ( next
3 단계에서 세미콜론 을 추가 하고 필요함). 를 사용하여 1 단계를 테스트 할 수 있습니다 awk '{a[$1]} END { for (k in a) { print "a[k]=" k } }' file1
.
조회 NR
및 FNR
AWK 설명서에서 다음 조건이 무엇인지 스스로에게 물어 어떤에서 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
ARGIND
. 그렇지 않으면 할 수 있습니다 FNR==1{ print ++file_nr }
.
파일 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
a==b
과b==a
같은 결과를 생산?