ループ内のCSVファイル内の2つの単語列のトークン数を計算する方法は?

ループ内のCSVファイル内の2つの単語列のトークン数を計算する方法は?

50行を含むカンマ区切りのCSVファイルがあります。ある列は州名のためのものであり、もう一方の列は(注意)首都のためのものです。これら2つの列(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)。

2番目のループはソートキーを繰り返し、a(文字列化された)値をeval配列にロードしてから繰り返します。adeclare -pbb

関連情報