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
配列にロードしてから繰り返します。a
declare -p
b
b