awk는 첫 글자 뒤에 추가 공백을 제거합니까?

awk는 첫 글자 뒤에 추가 공백을 제거합니까?

awk는 첫 글자 뒤에 추가 공백을 제거합니까?

우리의 파일은 다음과 같습니다:

Blue    sky.    Nice       weather.
    White cloud.    Bright    sun.
        Cool air. Bla    bla          bla.

다음과 같은 것을 얻는 방법:

Blue sky. Nice weather.
    White cloud. Bright sun.
        Cool air. Bla bla bla.

이 명령은 awk '{$1=$1} 1' file모든 추가 공백을 제거합니다.
하지만 첫 글자 뒤에 있는 여분의 공백만 제거하면 됩니다.

아는 사람 있나요?
관심을 가져주셔서 감사합니다!

답변1

Linux를 실행 중이고 GNU Sed가 있는 경우 g대체 명령에 이 플래그와 번호를 사용할 수 있습니다 s.

sed -r 's/ +/ /g2' file.txt

인용하자면 info sed:

 Note: the POSIX standard does not specify what should happen when
 you mix the `g' and NUMBER modifiers, and currently there is no
 widely agreed upon meaning across `sed' implementations.  For GNU
 `sed', the interaction is defined to be: ignore matches before the
 NUMBERth, and then match and replace all matches from the NUMBERth
 on.

그러나 공백의 첫 번째 인스턴스(앞에 공백이 없는 경우)를 실제로 바꾸고 싶은 상황이 있으므로 전체 대답(GNU Sed 사용)은 다음과 같습니다.

sed -r 's/^/ /;s/ +/ /g2;s/^ //' file.txt

즉, 모든 줄에 선행 공백을 추가한 다음 첫 번째 공백을 제외한 연속 공백의 모든 인스턴스를 "압축"한 다음 추가된 선행 공백을 제거합니다.


선행 공백이 항상 8의 배수인 경우 다음 POSIX 호환 명령을 사용할 수 있습니다.

unexpand file.txt | sed 's/  */ /g' | expand

또는 더 간단하게:

unexpand file.txt | tr -s ' ' | expand

답변2

GNU awk를 사용하면 다음을 수행할 수 있습니다.

awk '{match($0,/(^[ ]+)/,arr)}; {$1=$1;printf("%s%s\n", arr[1], $0)}' 

match($0, /(^[ ]+)/, arr)줄 앞 공백을 캡처합니다.
$1=$1모든 선행 및 반복 공백을 제거하십시오.
printf("%s%s\n", a[1], $0)}선행 공백을 다시 추가하고 인쇄하십시오.

답변3

awk나는 이것이 KISS 방식이라고 생각합니다.

{tmp = substr($0,1,match($0,/[^ \t]/)-1); $1=$1; print tmp""$0}

전임자.

$ awk '{tmp = substr($0,1,match($0,/[^ \t]/)-1); $1=$1; print tmp""$0}' file
Blue sky. Nice weather.
    White cloud. Bright sun.
        Cool air. Bla bla bla.

관련 정보