일부 행에 null/누락된 값이 있는 경우 awk를 사용하여 데이터 추출

일부 행에 null/누락된 값이 있는 경우 awk를 사용하여 데이터 추출

아래와 같은 예가 있습니다.

입력.txt

   USERS        position   ref   rslt   
    usr1                    X     B   
    usr2          2980            C   
    usr3          3323      P      
    usr4                          A  
    usr5          5251      U      
    usr6          9990            A
    usr7          10345     T     

"rslt" 열과 해당 "USERS"를 인쇄해야 합니다. 출력 파일은 다음과 같아야 합니다.

출력.txt

  USERS     rslt   
   usr1       B   
   usr2       C       
   usr4       A
   usr6       A 

awk성공하지 못한 채 명령을 사용해 보았습니다 . 표의 검은색 위치는 모두 공백으로 채워져 있습니다. (각 행의 공백 개수는 다릅니다.)

답변1

이 경우 가능한 해결책은 시작 부분에 필드 너비를 제공하는 것입니다.

awk 'BEGIN {FIELDWIDTHS = "16 11 6 7"} 
    $4 ~/[^ ]/ {print $1 $4}' 

필드 너비는 수동으로 계산할 수 있지만 복잡한 헤더의 경우 먼저 계산하는 것을 좋아합니다.

 head -1 f | grep -Po '.*? (?=\S|$)' | awk '{print length}'

업데이트: ...또는 헤더의 초기 및 마지막 공백을 처리하려면 다음을 수행하세요.

 head -1 f | grep -Po '(^ *|\S).*?( (?=\S)|$)' | awk '{print length}'

답변2

이것명령은 작업에 가장 적합한 도구가 아닙니다. 사용자르다, 이는 추출할 필드의 문자 위치를 매개변수로 사용합니다. 따라서 예제에서는 USERS문자 위치 1에서 시작하고 문자 위치 8에서 끝나고 rslt문자 위치 33에서 시작하도록 지정합니다.

$ 컷 -c 1-8,33- input.txt
   사용자lt
    usr1B
    usr2C
    usr3
    usr4A
    usr5
    usr6A
    usr7

문자 위치 계산 방법에 대한 자세한 내용은 아래를 참조하세요.

         1 2 3         
123456789012345678901234567890123456789
   사용자 위치 참조 rslt   
    usr1XB   
    usr2 2980℃   
    usr3 3323P      
    usr4A  
    usr5 5251 유      
    usr6 9990A
    usr7 10345T      

답변3

당신은 얻을 수 있습니다거의unexpand유틸리티 "tab"을 사용하여 입력한 다음 awk필드 구분 기호를 탭으로 설정하고 최종 필드가 공백 이외의 항목으로 구성된 줄만 인쇄합니다.

unexpand -t8 input.txt | awk -F'\t' '$NF ~ /[^ ]/ {print $1, $NF}'
    usr1   B
    usr2   C
    usr4   A
    usr6   A

position및 필드 ref사이의 공간이 적기 때문에 머리글 행에서는 작동하지 않습니다 . 헤더가 필요한 경우 별도로 처리할 수 있습니다.

unexpand -t8 input.txt | awk -F'\t' 'NR == 1 {print $1,$3} $NF ~ /[^ ]/ {print $1, $NF}'

관련 정보