파일을 반복하고 두 열의 값을 변수로 읽습니다.

파일을 반복하고 두 열의 값을 변수로 읽습니다.

data.dat3개의 열이 있는 파일( )이 있습니다. 쉘 스크립트를 사용하여 그 중 두 개를 읽고 내용을 템플릿 파일에 채우고 싶습니다. 파일은 다음과 같습니다.

12 180 2390
14 177 2210
16 173 2130
...

지금까지는 다음과 같은 변수(데이터 파일의 열 2)를 사용하여 이 작업을 수행할 수 있습니다.

for a in `cat data.dat | gawk '{print $2}'`; do
 sed s/A/$a/ daily.template daily.template > daily.inp
done

이제 열 3도 읽고 열 2와 동일한 행의 해당 값(b)을 동일한 템플릿에 할당하려고 합니다. 템플릿에는 "A"와 "B"라는 변수가 포함되어 있습니다. b의 모든 값에 대해 a의 모든 값을 반복하고 싶지 않기 때문에 중첩된 for 루프를 수행할 수 없습니다.

이 목표를 어떻게 달성할 수 있나요?

다음에 추가:

우선 모든 도움에 감사드립니다!

네, daily.template 파일에 대한 자세한 정보를 제공하면 이해가 더 쉬울 것 같습니다. 다음과 유사해 보입니다.

dens_column O3 300.00
dens_column h20 B
sza A
day_of_year 172
output sum
...

A와 B는 라인의 모든 루프에서 교체되어야 합니다. data.dat의 첫 번째 열은 의미가 없으며 측정된 시간만 표시하며 이 매개변수는 "daily.inp"에서는 필요하지 않습니다. 각 행에 A와 B가 해당 행의 열 2와 열 3의 해당 값으로 대체되는 "daily.inp"가 있기를 원합니다. daily.inp 파일은 다음과 같습니다.

dens_column O3 300.00
dens_column h20 2390
sza 180
day_of_year 172
output sum
...

그런 다음 다음 파일이 분리됩니다.

dens_column O3 300.00
dens_column h20 2210
sza 177
day_of_year 172
output sum
...

등...

답변1

그렇다면 이것은 단지 질문이 될 것입니다:

while read discard x y discard; do
  sed "s/A/$x/g;s/B/$y/g" < daily.template > "daily.$x-$y.inp"
done < data.dat

read명령은 한 번에 한 줄씩 읽어서 data.dat첫 번째 필드(공백으로 구분된 필드, 백슬래시를 사용하여 필드 또는 줄 구분 기호를 이스케이프할 수 있음)를 변수에 넣고 $discard두 번째 필드를 변수 $x에 넣습니다. $y나머지 필드는 의 필드에 배치됩니다 $discard.

답변2

gawk인쇄 $2및 에 두 열을 모두 저장할 수 있습니다 $3. 그런 다음 이를 별도의 변수로 추출 a1하고 여기에서는 두 개의 템플릿 변수를 a2사용합니다 .colsed

답변3

이 작업을 수행하려면 termsql을 사용할 수 있습니다.

while read a b; do
   termsql -xwi daily.template "update tbl set COL2='$a' where COL1='h20'; update tbl set COL1='$b' where COL0='sza'" > daily$a$b.inp
done < <(termsql -wi data.dat "select COL1,COL2 from tbl")

장점: SQL을 알고 있다면 새로운 구문을 배울 필요가 없습니다.

여기서 termsql을 얻을 수 있습니다: https://gitorious.org/termsql

관련 정보