한 필드의 내용을 다른 필드의 내용으로 바꾸기

한 필드의 내용을 다른 필드의 내용으로 바꾸기

여기서는 구분 기호를 기준으로 첫 번째 열을 나누고 싶습니다 -. 마지막 열(여기서는 열 2)은 마지막 값을 기준으로 채워져야 합니다. 값이 01or 이면 99각각 2또는 으로 바꿉니다 1.

#input
PE01-02-01  -9
PE01-02-99  -9
PE01-03-01  -9
PE01-03-99  -9
PE01-05-01  -9
PE01-05-99  -9

#output
PE01-02-01  2
PE01-02-99  1
PE01-03-01  2
PE01-03-99  1
PE01-05-01  2
PE01-05-99  1

이를 달성하는 방법에 대한 조언을 제공해 주실 수 있습니까? 첫 번째 열을 배열로 분해하고 마지막 요소에 액세스한 다음 두 번째 열을 업데이트하려고 합니다.

답변1

중첩을 사용하면 다소 신비롭게 이 작업을 수행할 수 있습니다.조건부 연산자?:(일명 삼항 연산자)

awk '{$2 = $1 ~ /-01$/? 2: $1 ~ /-99$/? 1: $1; print}' input

PE01-02-01 2
PE01-02-99 1
PE01-03-01 2
PE01-03-99 1
PE01-05-01 2
PE01-05-99 1

번갈아

awk '{n = split($1, a, "-"); $2 = a[n] == "01" ? 2: a[n] == "99"? 1: a[n]; print}' input

답변2

펄 솔루션:

perl -ane 'BEGIN { $" = "\t" }
           $F[0] =~ /(..)$/,
               $F[-1] = { "01" => 2, "99" => 1 }->{$1} || $F[-1];
           print "@F\n" ' input_file > output_file
  • -n입력을 한 줄씩 읽습니다.
  • -a공백의 각 줄을 @F 배열로 분할합니다.
  • $""@F"배열 구성원이 큰따옴표( )로 탭으로 구분되도록 탭으로 설정합니다.
  • $F[0]마지막 두 문자를 추출하는 정규 표현식과 일치합니다.$1
  • $F[-1]마지막 열은 에 따라 2 또는 1로 설정됩니다 $1. $1다른 값이면 원래 값이 유지됩니다 .

관련 정보