다른 파일에서 열을 선택하고 복사하여 새 파일을 만드는 방법

다른 파일에서 열을 선택하고 복사하여 새 파일을 만드는 방법

네 개의 파일이 있는데 각 파일에는 일일 사이트 데이터가 포함되어 있습니다.

  • 파일 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, nTminnTmax입니다 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대신에 이렇게 할 수 있습니다 . 다른 파일의 내용과 일치하지 않는 줄을 출력에 넣는 데는 몇 가지 까다로운 옵션이 있으므로 매뉴얼 페이지를 매우 주의 깊게 읽고 원하는 것을 얻기 위해 몇 가지 실험을 수행해야 할 수도 있습니다.pastejoinjoin

답변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

관련 정보