4열의 값을 기준으로 3열의 값을 바꾸는 방법

4열의 값을 기준으로 3열의 값을 바꾸는 방법

다음과 같은 파일이 있습니다 test.txt.

000092;;;;2004;;;;N;;;;N

000098;;;;0086;;;;Y;;;;Y

세 번째 열의 값을 기준으로 네 번째 열의 값을 업데이트하고 싶습니다. 4열의 값이 이면 N3열의 값을 로 바꾸고 NA, 4열의 값이 이면 Y3열의 값을 로 바꿉니다 UPDATE.

출력은 다음과 같아야 합니다.

000092;;;;2004;;;;NA;;;;N

000098;;;;0086;;;;UPDATE;;;;Y

답변1

awk -F ';;;;' -v 'OFS=;;;;' '$4 == "Y" { $3 = "UPDATE" } $4 == "N" { $3 = "NA" } { print; }' test.txt

test.txt질문 인쇄에 지정된 대로

000092;;;;2004;;;;NA;;;;N
000098;;;;0086;;;;UPDATE;;;;Y

;;;;질문에 언급된 대로 실제로는 (단일 세미콜론)로 구분된 13개의 열 대신 (4개의 세미콜론)으로 구분된 4개의 열만 있다고 가정합니다 ;. 따라서 4개 그룹 사이에 추가 데이터가 포함된 행이 있는 경우 이 스크립트는 작동하지 않습니다 ;.

설명하다:

-F ';;;;'입력 필드 구분 기호 설정
-v 'OFS=;;;;'출력 필드 구분 기호 설정
$4 == "Y"조건: 필드 4인 경우 예 Y
{ $3 = "UPDATE" }조치: 필드 3 수정
무조건 조치와 동일: (결과) 행 인쇄NNA
{ print; }

답변2

awk를 사용하여 먼저 입력 n 출력 필드 구분 기호를 설정한 다음 입력 데이터에서 y 또는 n만 포함된 레코드를 찾은 다음 변경하고 마지막으로 stdout으로 인쇄합니다.

$ awk -F';;;;' '
    BEGIN{OFS=FS}
    $4 ~ /^[NY]$/{$3 = ($4 == "N") ? "NA" : "UPDATE"}1
' file

또 다른 접근 방식은 다음과 같습니다.

$ awk -F';;;;' 'BEGIN{OFS=FS;a["N"]="NA";a["Y"]="UPDATE"}
  $4 ~ /^[NY]$/{$3 = a[$4]}1' file

관련 정보