여기서는 구분 기호를 기준으로 첫 번째 열을 나누고 싶습니다 -
. 마지막 열(여기서는 열 2)은 마지막 값을 기준으로 채워져야 합니다. 값이 01
or 이면 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
다른 값이면 원래 값이 유지됩니다 .