awk를 사용하여 열 교체

awk를 사용하여 열 교체

파일이 있습니다:

50102.5924   4.2599   4.2184  1.0098   4.2392
50103.5903   4.2895   4.2474  1.0099   4.2685
50107.5850   4.2100   4.2286  0.9956   4.2193
50108.5331   4.1477   4.1112  1.0089   4.1295
50108.7620   4.0770   4.1060  0.9929   4.0915
50109.5345   4.2227   4.2153  1.0018   4.2190
50109.7681   4.1677   4.1673  1.0001   4.1675
50110.5308   4.2333   4.3158  0.9809   4.2746
50110.7612   4.2339   4.2743  0.9905   4.2541
50111.5591   4.1330   4.1542  0.9949   4.1436
50112.5324   4.1417   4.0986  1.0105   4.1202
50112.7668   4.0075   3.9844  1.0058   3.9960
50113.5301   4.2147   4.2147  1.0000   4.2147
50113.7639   4.2263   4.2263  1.0000   4.2263
50114.5321   4.1205   4.1211  0.9999   4.1208

더 많은 파일이 있습니다:

4.5149 50102.5924   72.220     1.000     1    1
4.5683 50103.5903   -3.800     1.000     1    1
4.4682 50107.5850  -23.670     1.000     1    1

파일의 첫 번째 열이 많은 파일의 두 번째 열과 동일하도록 많은 파일의 첫 번째 열을 파일의 마지막 열로 바꾸려면 어떻게 해야 합니까?

예제에 제공된 작은 파일의 예상 결과는 다음과 같습니다.

4.2392 50102.5924   72.220     1.000     1    1
4.2685 50103.5903   -3.800     1.000     1    1
4.2193 50107.5850  -23.670     1.000     1    1

나는 시도했다:

for f in small_file*; do 
    awk 'NR==FNR{ar[$1]=$5;next} ($2 in ar) {$1= ar[$1]}1'  her_OK "$f" > "${f}_em"
done

작은 파일의 첫 번째 열은 교체되지 않고 사라집니다.

답변1

$1 = ar[$2]대신 사용해야 합니다 ar[$1].

또한 루프가 필요하지 않으며 for셸에서 리디렉션할 필요도 없습니다. awk파일 이름을 직접 구성하고 출력을 리디렉션할 수 있습니다.

awk 'NR==FNR {
       ar[$1]=$5; next
     }

     ($2 in ar) {
       $1 = ar[$2];
       print > FILENAME "_em"
     }'  her_OK small_file*

산출:

4.2392 50102.5924 72.220 1.000 1 1
4.2685 50103.5903 -3.800 1.000 1 1
4.2193 50107.5850 -23.670 1.000 1 1

그런데, 후속 실행에서도 파일을 다시 처리하지 않도록 다른 파일 이름 접두사(또는 다른 출력 디렉터리)를 사용해야 합니다 small_file*_em. 예를 들어

mkdir new

그리고 awk 스크립트의 print 문을 다음과 같이 변경합니다.

print > "new/" FILENAME "_em"

관련 정보