data.dat
3개의 열이 있는 파일( )이 있습니다. 쉘 스크립트를 사용하여 그 중 두 개를 읽고 내용을 템플릿 파일에 채우고 싶습니다. 파일은 다음과 같습니다.
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
사용합니다 .col
sed
답변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