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
배열에 로드한 다음 반복합니다.a
declare -p
b
b