csv 파일에서 고유 단어 수를 얻는 방법이 있습니까?

csv 파일에서 고유 단어 수를 얻는 방법이 있습니까?

다음 내용이 포함된 텍스트 파일이 있습니다.

Notes1,Notes2,Id3,Id4
I'd like to play tennis with you some day with everyone,Mary enjoys cooking,id1234,5678
Some of my friends can speak English well and turkish well,She likes bananas,id3456,9898

최종 출력은 다음과 유사합니다.

word, iterationcount,id3,id4,columnname
I'd , 1, id1234,5678,Notes1
like, 1, id1234,5678,Notes1
with, 2, id1234,5678,Notes1 .... 

some, 1, id3456,9898,Notes2
well, 2, id3456,9898,Notes2

열 1의 각 단어와 열 2의 동일한 출력에 대해 해당 개수는 Id3, Id4의 그룹화를 기반으로 합니다.

나는 다음과 같이 여러 접근법을 시도했습니다

awk -F, '{for (i=1; i<=NF-1; i++) words[$1","$2][$i]+=1} END {for (i in words) {for (word in words[i]) {print word "," words[i][word]}}} ' file.csv


awk -F, '{count[$2","$3]+=(NF-1); for (i=1; i<=NF-1; i++) words[$2","$3][$i]+=1} END {for (i in count) {for (word in words[i]) {print i, word, words[i][word]}}} ' file.csv | sort

뭔가 빠졌네요. 누구든지 제안할 수 있나요?

답변1

GNU awk(질문에 게시한 코드와 일반적으로 Linux의 awk 변형을 고려하여 이미 사용하고 있음) FPAT와 배열 배열을 사용합니다.

$ cat tst.awk
BEGIN {
    OFS = ","
    FPAT = "([^" OFS "]*)|(\"([^\"]|\"\")*\")"
}
NR == 1 {
    for ( i=1; i<=NF; i++ ) {
        fldName[i] = $i
    }
    next
}
{
    analyze(1)
    analyze(2)
}

function analyze(fldNr,     words,i,word,cnt,key,out) {
    out = "out" fldNr
    split($fldNr,words)
    for ( i in words ) {
        word = words[i]
        cnt[$3 OFS $4 OFS fldName[fldNr]][word]++
    }
    if ( !doneHdr[fldNr]++ ) {
        print "word", "iterationcount", "id3", "id4", "columnname" > out
    }
    for ( key in cnt ) {
        for ( word in cnt[key] ) {
            print word, cnt[key][word], key > out
        }
    }
}

$ awk -f tst.awk file.csv

$ head -100 out?
==> out1 <==
word,iterationcount,id3,id4,columnname
some,1,id1234,5678,Notes1
you,1,id1234,5678,Notes1
with,2,id1234,5678,Notes1
day,1,id1234,5678,Notes1
everyone,1,id1234,5678,Notes1
tennis,1,id1234,5678,Notes1
to,1,id1234,5678,Notes1
play,1,id1234,5678,Notes1
I'd,1,id1234,5678,Notes1
like,1,id1234,5678,Notes1
can,1,id3456,9898,Notes1
friends,1,id3456,9898,Notes1
well,2,id3456,9898,Notes1
Some,1,id3456,9898,Notes1
of,1,id3456,9898,Notes1
and,1,id3456,9898,Notes1
speak,1,id3456,9898,Notes1
my,1,id3456,9898,Notes1
turkish,1,id3456,9898,Notes1
English,1,id3456,9898,Notes1

==> out2 <==
word,iterationcount,id3,id4,columnname
cooking,1,id1234,5678,Notes2
Mary,1,id1234,5678,Notes2
enjoys,1,id1234,5678,Notes2
likes,1,id3456,9898,Notes2
bananas,1,id3456,9898,Notes2
She,1,id3456,9898,Notes2

위의 내용은 필드에 쉼표가 포함된 경우 큰따옴표로 묶이고, 인용된 필드에 큰따옴표가 포함된 경우 두 배로 이스케이프된다고 가정합니다.RFC 4180.

또한 어떤 필드에도 개행 문자가 포함될 수 없다고 가정합니다. 그들 중 누구라도 볼 수 있다면awk를 사용하여 csv를 효율적으로 구문 분석하는 가장 강력한 방법은 무엇입니까이를 처리하기 위해 무엇을 해야 하는지 알아보세요.

관련 정보