쉘을 사용하여 두 파일의 값을 계산하고 그 결과를 다른 파일에 저장해야 합니다.

쉘을 사용하여 두 파일의 값을 계산하고 그 결과를 다른 파일에 저장해야 합니다.

두 파일의 값을 계산하고 그 결과를 출력 파일에 저장해야 합니다. 출력 파일에서 각 레코드는 입력 파일에서 동일한 이름을 가진 레코드의 결과를 표시합니다.

문서 1

s1 10
s2 20 
s3 25 
s4 25  
s5 25   
s6 20 
s7 25 
s8 25

문서 2

s2 4
s1 10
s3 2 
s4 3 
s6 3
s7 2
s8 2 

산출

s1 100 
s2 80 
s3 50
s4 75 
s6 60 
s7 50 
s8 50

참고: 쉘을 사용해야 합니다.

답변1

이 스크립트는 필요한 작업을 수행합니다. 파일이 항상 다음 형식이라고 가정합니다.

id value, id2 value2, id3 value3

즉, 쉼표로 구분된 필드와 두 파일 간의 일관된 형식을 가정합니다. 또한 최신 버전이 bash인덱스 배열을 지원한다고 가정합니다. 또한 올바른 출력, 즉 표시된 출력(예: 2x25 != 75)이 아닌 요청한 출력을 제공합니다.

#!/usr/bin/env bash

## Read each line of the first file into the 
## array lines1.
mapfile -t lines1 < file1
## Do the same for the 2nd file and the array lines2.
mapfile -t lines2 < file2


declare -A fields2
declare -A fields1
## Iterate through each element of $lines2
## and separate ids from values
for ((i=0; i<${#lines2[@]}; i++)); do
    while read id val
    do
        fields2["$id"]="$val"
    done < <(printf "%s\n" "${lines2[$i]//, /$'\n'}")
done

## Iterate through each element of $lines1, separate
## ids from values.
for ((i=0; i<${#lines1[@]}; i++)); do
    while read id val
    do
        ## Some ids don't exist in both files, set their 
        ## value to 1 to avoid errors.
        if [[ -z "${fields2[$id]}" ]]; then
            fields2[$id]=1
        fi
        ## Print the id and the result of the multiplication.
        printf "%s %d " $id  "$(( ${fields2[$id]} * $val ))";
    done < <(printf "%s\n" "${lines1[$i]//, /$'\n'}")
    echo "";
done

관련 정보