자주 연관되는 키워드를 찾고 싶습니다.
예
디렉토리에는 마크다운 파일이 포함되어 있으며 각 파일의 마지막 줄에는 몇 가지 키워드가 있습니다.
$ tail -n 1 file1.md
#doctor #donkey #plants
$ tail -n 1 file2.md
#doctor #firework #university
$ tail -n 1 file3.md
#doctor #donkey #linux #plants
의사 출력
- "#donkey" 키워드가 포함된 파일 중 100%에는 "#doctor" 키워드도 포함되어 있습니다.
- "#plants" 키워드를 포함하는 파일의 50%에는 "#linux" 키워드도 포함되어 있습니다.
- …
쉘 스크립트, awk 스크립트 또는 이를 달성하는 방법에 대한 설명이면 충분합니다!
어떤 도움이라도 대단히 감사하겠습니다. 매우 감사합니다
답변1
배열의 배열에 GNU awk 사용:
nextfile
키워드가 각 파일의 첫 번째 줄에 있는 경우 효율성을 위해 GNU awk를 사용할 수도 있습니다 .
$ cat tst.awk
FNR == 1 {
for ( i=1; i<=NF; i++ ) {
words[$i]++
for ( j=i+1; j<=NF; j++ ) {
pairs[$i][$j]++
pairs[$j][$i]++
}
}
nextfile
}
END {
for ( word1 in pairs ) {
for ( word2 in pairs[word1] ) {
pct = pairs[word1][word2] * 100 / words[word1]
printf "%d%% of the files containing the keyword \"%s\" also contain the keyword \"%s\".\n", pct, word1, word2
}
}
}
$ awk -f tst.awk file*.md
100% of the files containing the keyword "#university" also contain the keyword "#doctor".
100% of the files containing the keyword "#university" also contain the keyword "#firework".
100% of the files containing the keyword "#plants" also contain the keyword "#donkey".
50% of the files containing the keyword "#plants" also contain the keyword "#linux".
100% of the files containing the keyword "#plants" also contain the keyword "#doctor".
100% of the files containing the keyword "#donkey" also contain the keyword "#plants".
50% of the files containing the keyword "#donkey" also contain the keyword "#linux".
100% of the files containing the keyword "#donkey" also contain the keyword "#doctor".
100% of the files containing the keyword "#linux" also contain the keyword "#plants".
100% of the files containing the keyword "#linux" also contain the keyword "#donkey".
100% of the files containing the keyword "#linux" also contain the keyword "#doctor".
33% of the files containing the keyword "#doctor" also contain the keyword "#university".
66% of the files containing the keyword "#doctor" also contain the keyword "#plants".
66% of the files containing the keyword "#doctor" also contain the keyword "#donkey".
33% of the files containing the keyword "#doctor" also contain the keyword "#linux".
33% of the files containing the keyword "#doctor" also contain the keyword "#firework".
100% of the files containing the keyword "#firework" also contain the keyword "#university".
100% of the files containing the keyword "#firework" also contain the keyword "#doctor".
아니면 마지막 줄에서 다시 gawk를 사용하세요 ENDFILE
.
$ cat tst.awk
ENDFILE {
for ( i=1; i<=NF; i++ ) {
words[$i]++
for ( j=i+1; j<=NF; j++ ) {
pairs[$i][$j]++
pairs[$j][$i]++
}
}
}
END {
for ( word1 in pairs ) {
for ( word2 in pairs[word1] ) {
pct = pairs[word1][word2] * 100 / words[word1]
printf "%d%% of the files containing the keyword \"%s\" also contain the keyword \"%s\".\n", pct, word1, word2
}
}
}
$ awk -f tst.awk file*.md
또는 여전히 마지막 줄에 있지만 tail+gawk를 사용하면 더 효율적입니다.
$ cat tst.awk
{
for ( i=1; i<=NF; i++ ) {
words[$i]++
for ( j=i+1; j<=NF; j++ ) {
pairs[$i][$j]++
pairs[$j][$i]++
}
}
}
END {
for ( word1 in pairs ) {
for ( word2 in pairs[word1] ) {
pct = pairs[word1][word2] * 100 / words[word1]
printf "%d%% of the files containing the keyword \"%s\" also contain the keyword \"%s\".\n", pct, word1, word2
}
}
}
$ tail -qn1 file*.md | awk -f tst.awk