열을 반복하고 값을 연관 배열에 저장합니다.

열을 반복하고 값을 연관 배열에 저장합니다.

다음과 같은 두 개의 열이 있는 텍스트 파일이 있습니다.

26 0.000342231
27 0.000342231
28 0.000684463
29 0.00136893
30 0.00102669
31 0.00308008
32 0.00308008
33 0.00444901
34 0.00718686
35 0.00718686
36 0.0109514
37 0.0123203
...

텍스트 파일을 반복하고 각 열 값을 사전과 유사한 연관 배열에 저장하고 싶습니다. 가능하다면 각 열(int 및 float)에 있는 값의 데이터 형식을 유지하고 싶습니다.

계산을 위해서는 파일 끝까지 특정 간격의 두 번째 열 값을 합산해야 합니다. 예를 들어 "(첫 번째 열) 관련 값 29(0.00136893)를 마지막 관련 값까지 합산합니다."

가장 좋은 접근 방식은 무엇입니까? Bash 및 Python 솔루션이 가장 인기가 있습니다!

답변1

편집, 질문을 잘못 읽고 귀하가 묻지 않은 것에 답변했습니다. 열 항목을 원하십니까?사전 키? 그러면 더 많은 데이터가 도착하면 중복 항목을 확인할 수 있습니까? 그렇지 않은 경우 연관 배열이 필요하지 않고 일반 인덱싱만 있으면 됩니다. 이렇게 하면 어디서든 시작할 수 있습니다.

Bash는 FP 수학을 전혀 수행하지 않으므로 bash 배열에 데이터를 넣는 것은 쓸모가 없습니다. >.<

정수 인덱싱을 원하고 인덱스가 음수가 될 수 없는 경우 연관(문자열 인덱스) 배열이 아닌 인덱스 배열을 사용해야 합니다.

루프를 사용하여 while read입력을 두 개의 변수로 구문 분석한 다음 이를 사용하여 배열을 설정합니다.

declare -a arr
# declare -A arr  # associative

while read c1 c2 leftovers;do
    arr[c1]=$c2;
done < file.txt

echo "arr[4] == ${arr[4]}"

실제로는 필요하지 않으며 declare -a그냥 사용해도 됩니다. 또한 "${#arr}"은 배열의 컬렉션 요소 수입니다.아니요마지막 인덱스여야 합니다. ( arr[-1]마지막 요소에 액세스하는 데 사용됩니다.)는 "${!arr[@]}"인덱스(키) 목록입니다.

물론 다른 모든 것 역시 bash 수동 작업에서 비롯됩니다.

답변2

그리고 bash:

arr1=( $( cut -d' ' -f1 file ) )
arr2=( $( cut -d' ' -f2 file ) )

즉, cut -f공백을 구분 기호로 사용하고 1 (또는 2) 을 생성 -d하고 출력을 배열에 할당합니다.

bash는 변수의 데이터 유형을 구별하지 않으며 배열의 첫 번째 인덱스 번호는 0입니다.

그리고 bash그리고bc

echo ${arr2[@]} | sed 's/ /+/g' | bc -l

즉, 모든 배열 요소(구분 기호로 공백 포함)를 인쇄하고 공백을 "+"로 바꾼 다음 실제 수학 연산을 위해 bc -l로 보냅니다.

관련 정보