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