이상한 코드 설명

이상한 코드 설명

작동해야 하는 일부 코드가 제공되었지만 작동하지 않으며 그 이유를 이해하려고 노력하고 있습니다. 그런 이유로 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정말로 FNR>NR필요 하지 않습니다 . 1 . 또한 {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합법적이지만 실제로는 거의 수행되지 않습니다.

관련 정보