이 예의 출력에서 ​​필드가 공백으로 구분되지 않는 이유는 무엇입니까?

이 예의 출력에서 ​​필드가 공백으로 구분되지 않는 이유는 무엇입니까?

신청시

awk -F'[,/]' '{sub(/\/[0-9]+/, "/" ($2+3) ); print $0}'

입력하다

Statements and Functions/399,Black,notBold

왜 출력이

Statements and Functions/402,Black,notBold

바꾸다

Statements and Functions 402 Black notBold

?

  1. -F'[,/]'awk가 입력을 읽을 수 있도록 필드 구분 기호를 또는 FS로 변경하세요.,/

    OFS기본값은 공백입니다. 그렇다면 print $0모든 필드가 구분 기호로 연결되어 생성 되지 않는 $1경우 는 언제입니까 ?$NFOFS$0

  2. 변화

    awk -F'[,/]' '{sub(/\/[0-9]+/, "/" ($2+3) ); print $0}'
    

    도착하다

    awk -F'[,/]' '{sub(/\/[0-9]+/, "/" ($2+3) ); $1=$1; print $0}'
    

    출력됩니다

    Statements and Functions 402 Black notBold
    

    입력용

    Statements and Functions/399,Black,notBold
    

    그렇다면 (필드에 할당하는 것 외에) 어떤 다른 상황을 $0 재형식화와 함께 사용할 수 있습니까 OFS?

  3. $0형식을 다시 지정 하기 위해 필드를 변경해야 하는 경우 OFS그 이유는 무엇입니까?

    awk -F'[,/]' '{sub(/\/[0-9]+/, "/" ($2+3) ); print $0;  print $2;  print $0}'
    

    입력에 적용

    Statements and Functions/399,Black,notBold
    

    출력 표시값은 ? 에 $2관계없이 변경됩니다 .$0OFS

    Statements and Functions/402,Black,notBold
    402
    Statements and Functions/402,Black,notBold
    

답변1

awk필드를 강제로 다시 포맷하려면 필드가 변경되었는지 확인해야 합니다 OFS. $0귀하의 경우처럼 전체를 교체 한다면 awk부품을 나누어서 다시 포맷할 필요가 없습니다.

상황이 변경되었음을 받아들이도록 하려면 다음과 같이 할 수 있습니다.

awk -F'[,/]' '{sub(/\/[0-9]+/, "/" ($2+3) ); $1=$1; print $0}'

이것은 $1=$1실제로 작동합니다 :)

sub()변경되지 않는다는 점에 유의하세요 $2. 변경 사항을 검색 $0하고 값으로 업데이트합니다 $2+3. 그러나 업데이트되지 않고 $2업데이트되므로 $0재포맷이 실행되지 않습니다.

답변2

다음을 사용하면 더 나은 서비스를 받을 수 있다고 생각합니다.

awk -F'[,/]' '{$2=($2+3)}1' infile

infile은 다음과 같습니다.

$ cat infile
The Ubiquitous Backslash/49,Black
The Ubiquitous Backslash/17,Black
Statements and Functions/399,Black,notBold

당신은 얻을 것이다:

$  awk -F'[,/]' '{$2=($2+3)}1' infile
The Ubiquitous Backslash 52 Black
The Ubiquitous Backslash 20 Black
Statements and Functions 402 Black notBold

화타이

관련 정보