여러 파일 간에 동일한 단어를 비교하는 방법은 무엇입니까?

여러 파일 간에 동일한 단어를 비교하는 방법은 무엇입니까?

여러 파일에 있는 같은 단어의 수를 세어 어떤 파일에 있는지 표시하고 싶습니다.

파일 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

관련 정보