아래와 같은 예가 있습니다.
입력.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}'