awk에서 파일의 특정 숫자 변환

awk에서 파일의 특정 숫자 변환

큰 문제가 있습니다. 다음과 같은 파일이 있습니다.

   18   13    8    5        3       1.715   2.845   1.046  -5.607  -0.000   0.000
   38   34   29   24        3       1.715   2.845   1.046  -5.607  -0.000   0.000
   12   14    9    5        3       1.715   2.845   1.046  -5.607  -0.000   0.000
   34   29   24   30        3       1.715   2.845   1.046  -5.607  -0.000   0.000
   14    9    5    3        3       1.715   2.845   1.046  -5.607  -0.000   0.000
   13    8    5    3        3       1.715   2.845   1.046  -5.607  -0.000   0.000
   34   29   24   28        3       1.590   4.770   0.000  -6.360  -0.000   0.000
   13    8    5    7        3       1.590   4.770   0.000  -6.360  -0.000   0.000
   14    9    5    7        3       1.590   4.770   0.000  -6.360  -0.000   
    7    5    3    6        3       0.628   1.883   0.000  -2.510  -0.000   0.000
    7    5    3    4        3       0.628   1.883   0.000  -2.510  -0.000   0.000
    7    5    3    2        3       0.979   2.937   0.000  -3.916  -0.000   0.0000.000
   14    9    5    8        3      -6.458   0.810   5.682  -0.033  -0.000   0.000
   13    8    5    9        3      -6.458   0.810   5.682  -0.033  -0.000   0.000
   34   29   24   22        3      -6.458   0.810   5.682  -0.033  -0.000   0.000
etc

gsub를 사용하여 특정 숫자를 특정 숫자로 바꿉니다. 예를 들면 다음과 같습니다.

awk '{ gsub(/1/, "9"); gsub(/2/, "8"); gsub(/3/, "6"); gsub(/4/, "7"); gsub(/5/, "4"); gsub(/6/, "10"); gsub(/7/, "5"); gsub(/82/, "92"); gsub(/83/, "91"); gsub(/84/, "94"); gsub(/85/, "93"); gsub(/86/, "97"); gsub(/87/, "95"); gsub(/88/, "96"); etc.....
print $1, $2, $3, $4 }' proba | tee proba2

그런데 질문이 있어요. 예를 들어, 111을 45로 바꾸고 싶기 때문에 gsub를 사용하고 내 문서에 45를 포함시킨 다음 스크립트에서 다시 gsub를 사용하여 4를 76으로 바꾸면 4가 76으로 바뀌고 45도 765로 바뀌게 됩니다! - 난 그런 걸 원하지 않아요.

이 코드를 시도했지만 작동하지 않습니다

awk '{ gsub(/ 1 /, " 9 "); gsub(/ 2 /, " 8 "); gsub(/ 3 /, " 6 "); gsub(/ 4 /, " 7 "); gsub(/ 5 /, " 4 "); gsub(/ 6 /, " 10 "); gsub(/ 7 /, " 5 "); gsub(/ 8 /, " 23 "); gsub(/ 9 /, " 3 "); gsub(/ 10 /, " 11 "); gsub(/ 11 /, " 12 ");  print $1, $2, $3, $4 }' proba | tee proba2

정수를 바꾸고 싶습니다. 나는 12되고 싶지 않다 98. 네 개의 열($1, $2, $3, $4 인쇄)의 정수를 바꾸고 싶습니다. 예를 들어 입력 형식: 22 56 3 75예를 들어 입력과 동일한 형식을 갖는 출력 형식 35 82 91 5은 괜찮지만 그다지 중요하지는 않습니다. (나중에 직접 형식을 편집할 수 있습니다)

답변1

replace.txt예를 들어 대체 항목, 열 1의 이전 값, 열 2의 새 값을 아래와 같이 사용 하여 파일을 생성하는 것이 좋습니다.

1 9
2 8
3 6
4 7
5 4
6 10
7 5
82 92
83 91
84 94
85 93
86 97
87 95
88 96

데이터 파일이 다음과 같다고 가정하면 data.txt다음 AWK 스크립트를 사용할 수 있습니다.

awk 'NR==FNR { t[$1]=$2; next;} # fill translation table from first file
{ for(i=1;i<5;i++) { # process columns 1..4
        if ($i in t) { # replacement available
                $i=t[$i]; # replace field only once
        }
  }
  print $1, $2, $3, $4;
  # or if you want all columns:
  # $1=$1 # this makes sure unmodified lines get the new format
  # print # print all fields after modification
}' replace.txt data.txt

귀하의 입력을 바탕으로 다음이 생성됩니다.

18 13 8 4
38 34 29 24
12 14 9 4
34 29 24 30
14 9 4 6
13 8 4 6
34 29 24 28
13 8 4 5
14 9 4 5
5 4 6 10
5 4 6 7
5 4 6 8
14 9 4 8
13 8 4 9
34 29 24 22

또는 대체 출력을 사용하십시오

18 13 8 4 3 1.715 2.845 1.046 -5.607 -0.000 0.000
38 34 29 24 3 1.715 2.845 1.046 -5.607 -0.000 0.000
12 14 9 4 3 1.715 2.845 1.046 -5.607 -0.000 0.000
34 29 24 30 3 1.715 2.845 1.046 -5.607 -0.000 0.000
14 9 4 6 3 1.715 2.845 1.046 -5.607 -0.000 0.000
13 8 4 6 3 1.715 2.845 1.046 -5.607 -0.000 0.000
34 29 24 28 3 1.590 4.770 0.000 -6.360 -0.000 0.000
13 8 4 5 3 1.590 4.770 0.000 -6.360 -0.000 0.000
14 9 4 5 3 1.590 4.770 0.000 -6.360 -0.000
5 4 6 10 3 0.628 1.883 0.000 -2.510 -0.000 0.000
5 4 6 7 3 0.628 1.883 0.000 -2.510 -0.000 0.000
5 4 6 8 3 0.979 2.937 0.000 -3.916 -0.000 0.0000.000
14 9 4 8 3 -6.458 0.810 5.682 -0.033 -0.000 0.000
13 8 4 9 3 -6.458 0.810 5.682 -0.033 -0.000 0.000
34 29 24 22 3 -6.458 0.810 5.682 -0.033 -0.000 0.000

관련 정보