여러 파일에 있는 같은 단어의 수를 세어 어떤 파일에 있는지 표시하고 싶습니다.
파일 1:
This is so beautiful
파일 2:
There are so beautiful
파일 3:
so beautiful
원하는 출력 1:
so:3
beautiful:3
원하는 출력 2:
so:
file1:1
file2:1
file3:1
beautiful:
file1:1
file2:1
file3:1
답변1
이 시도,
# Declare the files you want to include
files=( file* )
# Function to find common words in any number of files
wcomm() {
# If no files provided, exit the function.
[ $# -lt 1 ] && return 1
# Extract words from first file
local common_words=$(grep -o "\w*" "$1" | sort -u)
while [ $# -gt 1 ]; do
# shift $1 to next file
shift
# Extract words from next file
local next_words=$(grep -o "\w*" "$1" | sort -u)
# Get only words in common from $common_words and $next_words
common_words=$(comm -12 <(echo "${common_words,,}") <(echo "${next_words,,}"))
done
# Output the words common to all input files
echo "$common_words"
}
# Output number of matches for each of the common words in total and per file
for w in $(wcomm "${files[@]}"); do
echo $w:$(grep -oiw "$w" "${files[@]}" | wc -l);
for f in "${files[@]}"; do
echo $f:$(grep -oiw "$w" "$f" | wc -l);
done;
echo;
done
산출:
beautiful:3
file1:1
file2:1
file3:1
so:3
file1:1
file2:1
file3:1
설명하다:
스크립트 내에 주석으로 포함됩니다.
특징:
- 당신이 가지고 있는 만큼의 파일ARG_MAX허용하다
- 단어 구분 기호로 인식되는 문자로 구분된 모든 단어를 찾습니다
grep
. - 대소문자는 무시되므로 "beautiful"과 "Beautiful"은 같은 단어입니다.
답변2
이 코드를 사용해 보세요. 필요한 경우 조정하세요.
bash-4.1$ cat test.sh
#!/bin/bash
OUTPUT_FILE=/tmp/output.txt
awk '{
for(i=1;i<=NF;i++)
{
Arr[$i]++
}
}
END{
for (i in Arr){
if(Arr[i]>1)
{
print i":"Arr[i]
}
}
}' file* > ${OUTPUT_FILE}
cat ${OUTPUT_FILE}
echo ""
IFS=":"
while read WORD TOTAL_COUNT
do
echo "${WORD}:"
for FILE_NAME in file*
do
COUNT=$(tr ' ' '\n' < ${FILE_NAME} | grep -c "${WORD}")
if [ "${COUNT}" -gt "0" ]
then
echo "${FILE_NAME}:${COUNT}"
fi
done
done < ${OUTPUT_FILE}
bash-4.1$ bash test.sh
beautiful:3
so:3
beautiful:
file1:1
file2:1
file3:1
so:
file1:1
file2:1
file3:1
답변3
grep
단어와 파일 이름을 제공한 다음 awk
원하는 결과를 얻기 위해 출력 형식을 다시 지정하는 데 사용됩니다 .
grep -Ho '\w\+' file* |
awk -F':' '{ words[$1 FS $2]++; seen[$2]++ }
END{ for (x in seen) {
print x":" seen[x];
for (y in words) {
if (y ~ "\\<" x "\\>")print substr(y, 1, length(y)-length(x)), words[y]
}
}
}'
그러면 다음과 같은 멋진 출력이 제공됩니다(원하는 출력을 한 번에 얻음).
so:3
file1: 1
file2: 1
file3: 1
This:1
file1: 1
beautiful:3
file3: 1
file1: 1
file2: 1
There:1
file2: 1
are:1
file2: 1
is:1
file1: 1
답변4
코드를 작성하고 싶지 않고 결과를 빠르게 알고 싶다면 다음 명령을 사용할 수 있습니다.
cat list_of_words | while read line; do echo $line; grep -riE '$line'-c where_to_look_or_folder; done
-r :read into files
-i: no casesensitive
-E: regexp is useable if you want something more complicated to search
-c: counter
산출:
word1
path:filename:count
예:
cat text | while read line; do echo $line; grep -riE '$line'-c somwhwere/nowhere; done