저는 프로그래머는 아니지만 파일을 잘라내어 해당 파일에서 다차원 배열을 생성하는 스크립트를 작성해야 합니다.
저는 화학자이므로 배열은 다음과 같아야 합니다.
[pe][pH][element][concentration].
이렇게 하면 개별 요소의 농도 변화를 그래프로 그릴 수 있습니다.pH그리고입다.
그래서 저는 입력 파일과 색인을 잘라내기 위해 이 스크립트를 작성했습니다.입다,pH그리고 종, 하지만 지금은 막혔어요. 나는 그것을 달성하는 방법을 모른다.
#!/bin/bash
inputFile='test.inp'
awk '/Distribution of species/ {f=1} /Saturation indices/ {f=0} f' $inputFile > distriPack.inout
csplit -z -f distri_ distriPack.inout /Distribution/ {*}
sed -i '1,5d; $d' distri_*
sed -i 's/^ *//' distri_*
cut -d ' ' -f1 distri_* | sort | uniq > especes.inp
grep -E "pH = " $inputFile | cut -d '=' -f 2 | cut -d ' ' -f 4 > ph.inp
grep -E "pe = " $inputFile | cut -d '=' -f 2 | cut -d ' ' -f 4 > pe.inp
declare -a tableVariable=(ipe ipH ies)
ipe=0
tablepe=0
for pe in cat "$pe.inp"
do
if ([ $ipe -eq 0 ] || pePrev=pe)
then
tablepe=$((tablepe+1))
ipe=$((ipe+1))
pePrev=$pe
fi
ipH=0
tablepH=0
for pH in cat "$pH.inp"
do
if ([ $ipH -eq 0 ] || pHPrev=pH )
then
tablepH=$((tablepH+1)) > tablepH.inp
ipH=$((ipH+1))
pHPrev=$pH
fi
ies=0
tablees=0
for espece in cat "$espece.inp"
do
if ([ $ies -eq 0 ] || especePrev=espece )
then
# indEspece=0
# for espece in distri_$pe
# do
# if ([ $indEspece -eq 0 ])
maVariable= grep -E "espece" < distri_10 | cut -d ' ' -f 1
${tableVariable[ $((ipe)) $((ipH)) $((ies)) ]}=$((maVariable))
# done
ies=$((ies+1))
tablees=$((tablees+1))
especePrev=$espece
fi
done
done
done
val=${monTableau[${i_pe} ${i_pH} ${es} ${pa}]}>monTableau.inp
나는 다음과 같은 것을 원합니다 :for [pe][pH][specie]=[0][12][15]
인덱스 테이블 = 농도.
그러나 bash와 Distri_(pe/pH index value) 파일의 두 번째 열에서 인덱스 k 종류에 for pe = i, pH = j
해당하는 행을 표현하는 방법을 모르겠습니다. 내 입력 파일의 "일부" 줄은 다음과 같습니다.specie=k
do indexTable[i][j][k]=value
>Initial solution 1. \newline
>Description of solution
>pH = 0.0
>pe = 0.0
>Distribution of species
>Species Molality log Activity
>H+ 1.1e+00 1.0e+00
>OH- 1.5e-14 9.5e-15
>Am+2 0.0e+00 0.0e+00
>Initial solution 2. pe 0 pH 0.5
>Description of solution
>pH = 0.5
>pe = 0.0
>Distribution of species
>Species Molality Log Activity
>H+ 4.1e-01 3.1e-01
>OH- 4.5e-14 3.1e-14
>Am+2 0.0e+00 0.0e+00
나는 다음과 같은 것을 얻고 싶습니다: outputfile_[pe value].out, 여기서 데이터는 다음과 같이 정렬됩니다:
>Column 1 C2 ..... Cn
>Specie\pH 0 n
>H+ [H+] at pH=0 [H+] at pH=n
등
답변1
강조된 텍스트 ">" 기호를 출력에 인쇄할지 아니면 입력에 표시할지 잘 모르겠습니다... 스크립트에서 수정할 수 있도록 피드백을 주세요.
이건 해야 해일을 하다만약에입력하다그리고산출예정확히설명하신 대로:
#!/usr/bin/awk
{
# Set the INDEX for each 'Initial Solution'
if ($1==">Initial"){
gsub(/\./,"",$3);
INDEX=$3;}
#Discard lines with 'Species' or 'Description'
if (($1==">Description")||($1==">Species")) next;
#Remove '>' from the first field
gsub(/>/,"",$1)
#Set the labels of the rows
PH[0]="Column"
PE[0]="Specie\\ph"
H[0]="H+"
OH[0]="OH-"
AM[0]="Am+2"
#Set other values (pH, pe, etc)
if ($1=="pH") PH[INDEX]=$3
if ($1=="pe") PE[INDEX]=$3
if ($1=="H+") H[INDEX]=$2" "$3
if ($1=="OH-") OH[INDEX]=$2" "$3
if ($1=="Am+2") AM[INDEX]=$2" "$3
}
# Print each array.
END {
for (i = 0; i <= INDEX; i++) printf("%s\t",i)
printf("\n")
for (i = 0; i <= INDEX; i++) printf("%s\t",PH[i])
printf("\n")
for (i = 0; i <= INDEX; i++) printf("%s\t",PE[i])
printf("\n")
for (i = 0; i <= INDEX; i++) printf("%s\t",H[i])
printf("\n")
for (i = 0; i <= INDEX; i++) printf("%s\t",OH[i])
printf("\n")
for (i = 0; i <= INDEX; i++) printf("%s\t",AM[i])
printf("\n")
}
몇 가지 참고사항:
- 첫 번째 줄(#!/usr/bin/awk)은 컴퓨터의 awk 위치를 가리켜야 합니다(
whereis awk
프롬프트에서 시도해 보세요). - 마지막 블록에서 \t는 필드 사이에 "탭" 문자를 삽입합니다. 필요에 따라 2개의 탭 \t\t, 쉼표 ',' 또는 간단한 공백 ' '으로 바꿀 수 있습니다.
- 이 스크립트를 저장하고 사용하려면 다음을 수행하세요.
awk -f script.name.awk input.file.inp