awk/cut을 사용하여 공백이 있는 열 데이터를 얻는 방법

awk/cut을 사용하여 공백이 있는 열 데이터를 얻는 방법

다음 형식의 데이터가 있습니다.

 16 SQL*Plus                            vilconv1                  dox-conv2
 16 TOAD background query session       Disha                     WORKGROUP\AD

이제 열별로 데이터를 가져오고 싶습니다. 다음 명령을 사용하고 있습니다.

awk '{print $1,$2}' 

그러나 열 2에는 공백이 있으므로 다음과 같은 출력이 제공됩니다.

16 SQL*Plus      
  16 TOAD

그리고 내가 원하는 것은:

16 SQL*Plus  
   16 TOAD background query session   

답변1

열이 탭 문자로 구분된 경우 탭 문자를 필드 구분 기호로 지정할 수 있습니다. 이렇게 하면 공백을 별도의 열로 처리하는 awk의 기본 동작이 방지됩니다.

cat <data file> | awk -F"\t" '{print $1, $2}'

root@ubuntu32:/tmp# cat testtext | awk -F"\t" '{print $1, $2}'
16 SQL*Plus
16 TOAD background query session

답변2

@Costas의 제안처럼 또 다른 옵션은 다음과 같습니다.

gawk '
  {
    f1=substr($0,2,2)
    f2=substr($0,4,36)
    gsub(/ *$/, "", f2)
    print f1 " " f2
  }
'

답변3

이를 수행하는 한 가지 방법에는 가 포함될 수 있습니다 unexpand. expand이에 대한 설명과 유틸리티를 찾을 수 있습니다.여기:

  • unexpand유틸리티는 파일 또는 표준 입력을 표준 출력으로 복사해야 하며, 각 줄의 시작 부분에 있는 문자를 최대 문자 수로 변환한 다음 <blank>원래 번역된 문자로 채워졌던 동일한 열 위치를 채우는 데 필요한 <tab>최소 문자 수로 변환해야 합니다. 기본적으로 탭 정지는 8개 열마다 설정되어야 합니다. 각각은 출력에 복사되어야 하며 탭으로 계산된 열 위치 수가 감소하도록 해야 합니다. 이 수가 1보다 작은 값으로 줄어들면 안 됩니다.<space><blank><backspace>

하지만 이 스위치가 필요할 수도 있습니다 -a.

  • -a<blank>- 각 줄의 시작 부분에 있는 문자를 번역하는 것 외에도 <blank>탭 정지 바로 앞에 있는 두 개 이상의 문자 시퀀스를 모두 탭으로 원래 채워졌던 동일한 열 위치를 채우는 데 필요한 최대 문자 수로 변환한 <tab>다음 채우기 문자를 <space>번역하는 데 필요한 최소 문자 수입니다 .<blank>

이것은 많은 공백을 탭으로 순차적으로 변환하는 간단한 유틸리티입니다. 그래서 당신은 할 수 있습니다 ...

unexpand -a <<\IN | cut -f1
 16 SQL*Plus                            vilconv1                  dox-conv2
 16 TOAD background query session       Disha                     WORKGROUP\AD
IN

...인쇄...

 16 SQL*Plus
 16 TOAD background query session

방금 거기에서 사용했지만 원한다면 cut사용하거나 다른 것을 사용할 수 있습니다 . awk내가 추천하는 이유는 거의 확실히 설치되어 있고 사용이 매우 간단하고 매우 빠르기 때문입니다. 구분 기호를 교체하여 공간 문제를 해결하며 매우 쉽습니다.

또한 작동 방식을 보여주기 위해 여기에 있는 문서를 사용하고 있지만 그렇게 하고 싶을 수도 있습니다...

unexpand -a <infile | filter program

관련 정보