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