루프 내부의 CSV 파일에 있는 두 단어 열의 토큰 수를 계산하는 방법은 무엇입니까?

루프 내부의 CSV 파일에 있는 두 단어 열의 토큰 수를 계산하는 방법은 무엇입니까?

50개의 행을 포함하는 쉼표로 구분된 CSV 파일이 있습니다. 한 열은 주 이름을 위한 것이고 다른 열은 (주의) 수도를 위한 것입니다. 이 두 열(2, 3, 4)의 마커 수를 계산하고 결과를 배열로 그룹화하는 루프를 어떻게 만들 수 있습니까? 이 작업을 수행할 때 그러한 상태가 몇 개 있는지 추적하는 것이 가능합니까?

답변1

솔루션은 대신 awk를 사용합니다. 출력에는 주의 이름만 포함되어야 한다는 질문을 통해 이해했습니다. 이전 답변은 더 유용한 출력을 제공했으며 OP는 해당 답변을 수락하여 스크립트가 동일한 형식과 동일한 데이터 세트를 따릅니다.

{
    x = $0
    gsub(/,/, " ", $0)
    a[x]=NF

}

END {
    for (key in a) {
        counter[a[key]] += 1
    }

    for (c in counter) {
        print counter[c] " values with " c " tokens:"
        for (key in a) {
            if (c == a[key]) {
                print "\t"key
            }
        }
    }
}

32 values with 2 tokens:
        Oregon,Salem
        Virginia,Richmond
        Montana,Helena
        Florida,Tallahassee
        Ohio,Columbus
        Delaware,Dover
        Nebraska,Lincoln
        California,Sacramento
        Wisconsin,Madison
        Alaska,Juneau
        Texas,Austin
        Tennessee,Nashville
        Hawaii,Honolulu
        Maryland,Annapolis
        Idaho,Boise
        Illinois,Springfield
        Wyoming,Cheyenne
        Georgia,Atlanta
        Connecticut,Hartford
        Arizona,Phoenix
        Indiana,Indianapolis
        Colorado,Denver
        Mississippi,Jackson
        Washington,Olympia
        Kentucky,Frankfort
        Vermont,Montpelier
        Maine,Augusta
        Michigan,Lansing
        Kansas,Topeka
        Alabama,Montgomery
        Massachusetts,Boston
        Pennsylvania,Harrisburg
16 values with 3 tokens:
        South Dakota,Pierre
        New Hampshire,Concord
        Arkansas,Little Rock
        North Carolina,Raleigh
        North Dakota,Bismarck
        Louisiana,Baton Rouge
        Oklahoma,Oklahoma City
        New York,Albany
        Nevada,Carson City
        Iowa,Des Moines
        South Carolina,Columbia
        Rhode Island,Providence
        New Jersey,Trenton
        Minnesota,St. Paul
        Missouri,Jefferson City
        West Virginia,Charleston
2 values with 4 tokens:
        Utah,Salt Lake City
        New Mexico,Santa Fe

답변2

State Capitals.csv다음 내용을 따르세요 .

Alabama,Montgomery
Alaska,Juneau
Arizona,Phoenix
...
West Virginia,Charleston
Wisconsin,Madison
Wyoming,Cheyenne

다음 Bash 스크립트(버전 4+)는 귀하가 요청한 작업을 수행합니다(귀하가 요청한 내용을 내가 이해한다고 가정).

#!/bin/bash -e

export PATH=/bin:/sbin:/usr/bin:/usr/sbin

declare -A a
declare -i i j
while IFS=, read state capital; do
    i=$(( $( echo "$state $capital" | tr -cd ' ' | wc -c ) + 1 ))
    if [[ -z ${a[$i]} ]]; then
        declare -a b=()
    else
        eval "${a[$i]}"
    fi
    b+=("$state|$capital")
    a[$i]=$( declare -p b )
done <<< $( sort 'State Capitals.csv' )

for i in $( IFS=$'\n'; echo "${!a[*]}" | sort -n ); do
    echo "The following \"state capital\" strings have $i tokens:"
    eval "${a[$i]}"
    for (( j = 0; j < ${#b[@]}; ++j )); do
        echo "${b[$j]}"
    done \
        | column -ts '|' \
        | sed -re 's/^/  /'
done

첫 번째 루프는 a인덱스가 "State Capital"의 단어 수이고 값이 "State|Capital" 항목을 포함하는 배열의 문자열 표현인 연관 배열( )을 채웁니다( 를 사용하여 문자열화 declare -p).

두 번째 루프는 정렬 키를 반복하고 a(문자열화된) 값을 eval배열에 로드한 다음 반복합니다.adeclare -pbb

관련 정보