다음 내용이 포함된 "Hessian_h2o_2z.log" 텍스트 파일이 있습니다.
GX1 GY1 GZ1 GX2 GY2 GZ2 GX3 GY3 GZ3
GX1 0.5915206
GY1 0.0139938 0.0135051
GZ1 -0.0876734 -0.0846119 0.5301078
GX2 -0.5223003 -0.0025088 0.0157183 0.5399848
GY2 0.0078178 -0.0011236 0.0070395 0.0007403 0.0012737
GZ2 -0.0489795 0.0070395 -0.0441035 -0.0046382 -0.0079797 0.0499940
GX3 -0.0692203 -0.0114850 0.0719552 -0.0176845 -0.0085581 0.0536178 0.0869048
GY3 -0.0218115 -0.0123815 0.0775724 0.0017685 -0.0001501 0.0009402 0.0200430 0.0125316
GZ3 0.1366530 0.0775724 -0.4860043 -0.0110801 0.0009402 -0.0058905 -0.1255729 -0.0785126 0.4918948
나는 숫자의 첫 번째 열(파일의 열 2)에 있는 각 값을 차례로 변수 X에 할당하려고 합니다. 이것이 지금까지 내가 가진 것입니다.
a=1
b=1
a=$((a+1))
b=$((b+1))
X=`awk -v A=$a -v B=$b 'NR == A {print $B}' Hessian_h2o_2z.log`
Y=`awk -v A=$a -v B=$b 'NR == A {print $B}' Hessian_h2o_3z.log`
for var in $X
do
echo $var
done
그러나 이것은 단지 출력을 생성합니다.
0.5915206
루프가 NR == 2 및 열 2를 지나 계속되지 않는 이유를 설명할 수 있는 사람이 있습니까?
참고로, 쉘 스크립팅은 상대적으로 새로운 것이므로 스크립트에 대한 도움말은 내가 달성하려는 목표에 비해 불필요하게 길다는 점에 유의하세요.
답변1
제 생각에는 귀하의 원래 접근 방식에 결함이 있습니다. (소량의 (깨끗한) 데이터의 경우) 순수 셸에서 이 작업을 수행할 수 있습니다.
다음과 같은 것이 도움이 될 수 있습니다.
while read -r VarName VarVal junk;
do eval "$VarName=\"$VarVal\"";
done < /tmp/exampleData;
GX1="GY1"
GX1="0.5915206"
GY1="0.0139938"
GZ1="-0.0876734"
GX2="-0.5223003"
GY2="0.0078178"
GZ2="-0.0489795"
GX3="-0.0692203"
GY3="-0.0218115"
GZ3="0.1366530"
for i in $(cut -f1 -d ' ' /tmp/exampleData );
do eval "echo $i → $"$i ;
done
cut -f1 -d ' ' /tmp/exampleData
echo GX1 → $GX1
GX1 → 0.5915206
echo GY1 → $GY1
GY1 → 0.0139938
echo GZ1 → $GZ1
GZ1 → -0.0876734
echo GX2 → $GX2
...