이상한 코드 설명

이상한 코드 설명

작동해야 하는 코드가 있지만 작동하지 않으며 왜 이런 일이 발생하는지 이해하려고 노력하고 있습니다. 이런 이유로 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합법적이지만 실제로는 거의 수행되지 않습니다.

관련 정보