작동해야 하는 코드가 있지만 작동하지 않으며 왜 이런 일이 발생하는지 이해하려고 노력하고 있습니다. 이런 이유로 bash와 awk를 배우려고 노력하고 있지만 혼란스럽습니다. 누군가가 이 awk 코드를 이해하는 데 도움을 줄 수 있다면 매우 기쁠 것입니다.
cvgMids.txt
다음과 같은 형식의 여러 줄이 포함되어 있습니다.
<http://rdf.freebase.com/ns/g.11b74p1stp> <http://rdf.freebase.com/ns/type.object.type> <http://rdf.freebase.com/ns/cvg.video_game_soundtrack> .
<http://rdf.freebase.com/ns/g.11bc4msmrn> <http://rdf.freebase.com/ns/type.object.type> <http://rdf.freebase.com/ns/cvg.cvg_developer> .
<http://rdf.freebase.com/ns/g.11bxxz28q6> <http://rdf.freebase.com/ns/type.object.type> <http://rdf.freebase.com/ns/cvg.computer_videogame> .
BEGIN{i=0;}
다음 줄에서 변수 i를 사용하는 것이 무엇인지 알 수 없습니다.그것은 무엇
<(cat cvgMids.txt) <(gzip -dc freebase-rdf-latest.gz) > cvg_predicates.txt
을 위한 것입니까? 나는 당신이 awk의 끝에 파일을 넣었다는 것을 알고 있지만 이 모든 괄호 등은 나를 혼란스럽게 합니다.
awk 'BEGIN{i=0;}
FNR == NR {
if($1 in a) next;
a[$1] = $1;
next
}
FNR<NR {
if($1 in a) {print $0;}}' <(cat cvgMids.txt) <(gzip -dc freebase-rdf-latest.gz) > cvg_predicates.txt
답변1
freebase-rdf-latest.gz
이 코드 조각이 수행하는 작업은 첫 번째 공백으로 구분된 필드가 의 $1
첫 번째 공백으로 구분된 필드와 일치하는 압축되지 않은 콘텐츠의 행을 출력하는 것입니다 cvgMids.txt
. 그러나 더 간단하게 작성할 수 있습니다.
특히:
지적하신 대로
i
어디에도 사용되지 않으므로BEGIN
블록이 제거될 수 있습니다.순서
if($1 in a) next; a[$1] = $1; next
로 줄일 수 있습니다
a[$1]; next
(의 배열가치절대 사용되지 않으며 해당 인덱스만 사용되며 인덱스를 여러 번 재할당하는 것은 테스트하고 조건부로 할당하는 것만큼 효율적입니다.)
규칙-작업에서
FNR<NR { if($1 in a) {print $0;}}
FNR<NR
이미 사건을 처리했고 그런 일이 일어나지 않을 것이기FNR==NR
때문에 실제로 그렇게 할 필요는 없습니다1 . 또한 이는 기본 작업입니다. 그래서 이렇게 쓰는 것이 더 관용적일 것입니다.FNR>NR
{print $0;}
$1 in a
<(cat cvgMids.txt)
그리고<(gzip -dc freebase-rdf-latest.gz)
껍질이에요프로세스 교체. 기능적으로 첫 번째는 다음과 동일합니다cvgMids.txt
.고양이에게 쓸모없는 용도쓸모없는 리디렉션). 어쩌면 미학적 이유로 사용되었을 수도 있습니다.
그것들을 합치면 우리는 얻는다.
awk 'FNR == NR {a[$1]; next} $1 in a' cvgMids.txt <(gzip -dc freebase-rdf-latest.gz) > cvg_predicates.txt
그러나 원본 버전이 작동하지 않으면 단순화된 버전도 작동하지 않습니다.
1 코드가 수정되지 않는 한 FNR
이는 NR
합법적이지만 실제로는 거의 수행되지 않습니다.