네 개의 파일이 있는데 각 파일에는 일일 사이트 데이터가 포함되어 있습니다.
- 파일 1:prec
- 파일 2: minT
- 파일 3: Max T
- 파일 4: 바람
여기서 prec, minT, maxT, Wind는 사이트 1~n에 대한 prec, minT, maxT, Wind 값을 저장하는 파일입니다.
각 스테이션의 데이터를 저장하고 싶습니다. 예를 들면 다음과 같습니다.
for station 1: prec minT maxT wind
station 2: prec minT maxT wind
.
.
.
.
station n: prec minT maxT wind
편집 #1
내 네 가지 데이터는 다음과 같습니다.
프리크
1 2 3 4 5 6 7 8
0 0 0 0 0 0 0 0
0.254 0.254 0.254 0.254 0.254 0.254 0.254 0.254
0 0 0 0 0 0 0 0
최저온도
1 2 3 4 5 6 7 8
-23.349 -23.339 -23.327 -23.316 -23.303 -23.291 -23.278 -23.266
-23.682 -23.683 -23.685 -23.687 -23.689 -23.692 -23.695 -23.698
-24.302 -24.301 -24.3 -24.299 -24.299 -24.299 -24.3 -24.302
최대 온도
1 2 3 4 5 6 7 8
-17.087 -17.082 -17.077 -17.072 -17.066 -17.06 -17.053 -17.046
-20.082 -20.095 -20.109 -20.124 -20.14 -20.157 -20.174 -20.191
-20.48 -20.481 -20.483 -20.485 -20.486 -20.488 -20.489 -20.49
바람
1 2 3 4 5 6 7 8
0 0 0 0 0 0 0 0
1.778 1.778 1.778 1.778 1.778 1.778 1.778 1.778
1.652 1.653 1.654 1.654 1.655 1.656 1.657 1.658
각 명명된 지점(예: 지점 1~8)에 대한 데이터 파일 형식을 다음과 같이 지정하고 싶습니다.
1
0 -23.349 -17.087 0
0.254 -23.682 -20.082 0
0 -24.302 -20.48 1.778
2
0 -23.339 -17.082 0
0.254 -23.683 -20.095 0
0 -24.301 -20.481 1.778
...기다리다 n
.
각 파일의 열은 nprec
, nTmin
및 nTmax
입니다 nwind
.
답변1
나는 당신이 사용할 수 있다고 생각 paste
하고 이것을 할 수 있습니다 join
.
paste file1 file2 > temp1
paste temp1 file3 > temp2
paste tmpe2 file4 > final
파일에 스테이션 1부터 스테이션 데이터까지 순서대로 포함되어 있으면 이것이 작동합니다. 그렇지 않은 경우 어떻게든 파일을 정렬해야 합니다. "station n" 기호가 모든 파일의 일부인 경우 이를 정렬해야 합니다.
sort -o file1 file1
sort -o file2 file2
... and so forth
그러면 위와 같은 방법 join
대신에 이렇게 할 수 있습니다 . 다른 파일의 내용과 일치하지 않는 줄을 출력에 넣는 데는 몇 가지 까다로운 옵션이 있으므로 매뉴얼 페이지를 매우 주의 깊게 읽고 원하는 것을 얻기 위해 몇 가지 실험을 수행해야 할 수도 있습니다.paste
join
join
답변2
설명에 따르면 4개 파일(Prec, Tmin, Tmax 및 Wind)을 반복하고 각 파일에서 열 데이터를 가져와 각 열에 대한 단일 파일로 병합하려는 것 같습니다.
이 방법
이를 달성하는 한 가지 방법은 Bash for
루프를 사용하는 것 paste
입니다 awk
. 방법은 다음과 같습니다.
for i in `seq 8`; do
... do stuff ...
done
이 루프의 주요 목적은 열 1부터 8까지 단계별로 진행하는 것입니다.
기둥 꺼내기
우리가 함께 구성해야 할 다음 기능은 파일에서 열 단위로 데이터를 추출하는 기능입니다. 한 가지 아이디어는 awk
.
$ awk '{print $1}' Prec
1
0
0.254
0
한 단계 더 나아가 다음과 같이 열의 참조 번호인 첫 번째 행을 건너뛰도록 할 수 있습니다.
$ awk 'NR>1{print $1}' Prec
0
0.254
0
awk
인쇄 중인 열을 다음과 같이 전달하는 변수가 되도록 매개변수화하여 한 단계 더 나아갈 수 있습니다 .
$ awk -v a=1 'NR>1{print $a}' wind
0
1.778
1.652
$ awk -v a=2 'NR>1{print $a}' wind
0
1.778
1.653
여러 파일에서 열 추출
이것은 아마도 이 솔루션 중 가장 우아하지 않은 부분일 것입니다. 그러나 저는 awk
멍청한 사람이므로 의심스러울 경우 시도해 보십시오.
이는 awk
각 파일에서 열 단위 데이터를 추출하고 paste
.
보기 쉽게 2개의 파일을 올려드립니다.
열 1
$ paste <(awk -v a=1 'NR>1 {print $a}' Prec) <(awk -v a=1 'NR>1 {print $a}' Tmin)
0 -23.349
0.254 -23.682
0 -24.302
2열
$ paste <(awk -v a=2 'NR>1 {print $a}' Prec) <(awk -v a=2 'NR>1 {print $a}' Tmin)
0 -23.339
0.254 -23.683
0 -24.301
4개 파일 모두에서 열을 얻으려면 이 방법을 간단히 확장하면 됩니다.
인덱스( $i
)를 1로 설정합니다.
$ i=1
$ paste <(awk -v a=$i 'NR>1 {print $a}' Prec) <(awk -v a=$i 'NR>1 {print $a}' Tmin) <(awk -v a=$i 'NR>1{print $a}' Tmax) <(awk -v a=$i 'NR>1 {print $a}' wind)
0 -23.349 -17.087 0
0.254 -23.682 -20.082 1.778
0 -24.302 -20.48 1.652
인덱스( $i
)를 2로 설정합니다.
$ i=2
$ paste <(awk -v a=$i 'NR>1 {print $a}' Prec) <(awk -v a=$i 'NR>1 {print $a}' Tmin) <(awk -v a=$i 'NR>1{print $a}' Tmax) <(awk -v a=$i 'NR>1 {print $a}' wind)
0 -23.339 -17.082 0
0.254 -23.683 -20.095 1.778
0 -24.301 -20.481 1.653
그것들을 하나로 합치다
paste <(awk ..) <(awk ..) <(awk ..) <(awk ..)
이제 루프 에 병합해 보겠습니다 for
.
$ for i in `seq 8`; do
echo "## $i ##"
paste <(awk -v a=$i 'NR>1 {print $a}' Prec) <(awk -v a=$i 'NR>1 {print $a}' Tmin) <(awk -v a=$i 'NR>1{print $a}' Tmax) <(awk -v a=$i 'NR>1 {print $a}' wind)
done
## 1 ##
0 -23.349 -17.087 0
0.254 -23.682 -20.082 1.778
0 -24.302 -20.48 1.652
## 2 ##
0 -23.339 -17.082 0
0.254 -23.683 -20.095 1.778
0 -24.301 -20.481 1.653
## 3 ##
0 -23.327 -17.077 0
0.254 -23.685 -20.109 1.778
0 -24.3 -20.483 1.654
...
echo
어떤 열이 인쇄되고 있는지 출력에서 더 쉽게 확인할 수 있도록 위에 추가 항목을 추가했습니다 .
모든 것을 파일에 쓰기
명령 뒤에 이 비트를 추가하면 paste ...
사용자가 지정하는 다양한 파일에 결과를 쓸 수 있습니다.
paste ... | tee out$i.txt
모든 것이 선과 같습니다.
$ for i in `seq 8`;do echo "## $i ##"; paste <(awk -v a=$i 'NR>1 {print $a}' Prec) <(awk -v a=$i 'NR>1 {print $a}' Tmin) <(awk -v a=$i 'NR>1{print $a}' Tmax) <(awk -v a=$i 'NR>1 {print $a}' wind) | tee out$i.txt;done
이로 인해 다음 파일이 작성됩니다.
$ ll
total 48
-rw-rw-r-- 1 saml saml 71 Aug 21 23:17 out1.txt
-rw-rw-r-- 1 saml saml 72 Aug 21 23:17 out2.txt
-rw-rw-r-- 1 saml saml 70 Aug 21 23:17 out3.txt
-rw-rw-r-- 1 saml saml 72 Aug 21 23:17 out4.txt
-rw-rw-r-- 1 saml saml 71 Aug 21 23:17 out5.txt
-rw-rw-r-- 1 saml saml 71 Aug 21 23:17 out6.txt
-rw-rw-r-- 1 saml saml 70 Aug 21 23:17 out7.txt
-rw-rw-r-- 1 saml saml 71 Aug 21 23:17 out8.txt