よく関連するキーワードを探してみたいです。
はい
ディレクトリにはマークダウンファイルが含まれており、各ファイルの最後の行にはいくつかのキーワードがあります。
$ 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