awk가 어떤 값도 인쇄하지 않는 이유는 무엇입니까?

awk가 어떤 값도 인쇄하지 않는 이유는 무엇입니까?

나는 배우기 시작했고 awk다음 명령을 실행했을 때 뭔가를 만났습니다.

$ echo ":a:b:c:" | awk '$1=$1' FS=":" OFS="$"
$ echo "a:b:c:" | awk '$1=$1' FS=":" OFS="$"
a$b$c$

$a$b$c$첫 번째 명령은 아무것도 반환하지 않지만 두 번째 명령과 유사하게 반환하고 싶습니다 . 일반적으로 필드 구분 기호가 줄의 시작 부분에 있으면 아무 것도 인쇄하지 않습니다. 왜 이런거야?

답변1

스크립트에서 인쇄는 기본 작업으로 실행되며, 이는 awk패턴으로 할당의 "부작용" 평가에 따라 달라집니다.$1=$1

첫 번째 경우, 첫 번째 구분 기호 앞에는 빈 필드가 오고 $1빈 문자열도 마찬가지로 FALSE로 평가됩니다. 두 번째 경우에는 TRUE로 평가되어 기본 인쇄 작업을 트리거하는 $1비어 있지 않은 문자열입니다 .a

답변2

awk가 레코드를 인쇄하도록 하려면 첫 번째 필드의 실제 값에 의존합니다. 빈 문자열의 진리값은 거짓이므로 awk는 값을 할당하는 것 외에는 아무것도 하지 않습니다. 1첫 번째 필드를 검사로 사용하는 대신 명시적으로 인쇄합니다(또는 항상 true인 다른 조건(예: ) 사용 ).

echo ":a:b:c:" | awk '{$1=$1; print}' FS=":" OFS="$"

답변3

  1. 매우 구체적인 요구 사항이 있는 경우를 제외하고(예: 존재하는 캐릭터를 제거하려고 하고 성공 시 일부 작업을 수행하려는 경우) 작업 결과를 조건으로 평가하지 마세요.
  2. 변수를 사용하는 코드를 보기 전에 설정되는 변수를 보면 코드를 더 쉽게 읽을 수 있으므로 파일 목록에 변수 할당을 나열하지 마세요.뒤쪽에매우 특정한 요구 사항(예: 파일 간 값 변경 등)이 없는 경우 -vawk를 호출하기 전에 또는 할당을 사용하여 나열합니다.BEGINENVIRON[]https://stackoverflow.com/q/19075671/1745001).
  3. 큰 따옴표를 사용하거나 따옴표를 사용하지 않아야 하는 매우 특별한 요구가 있는 경우가 아니면 셸의 모든 문자열(스크립트 포함) 주위에 작은 따옴표를 사용하십시오(참조https://mywiki.wooledge.org/Quotes).

따라서 스크립트는 awk -F':' -v OFS='$' '{$1=$1}1'.

관련 정보