awk -F가 대부분의 문자에는 작동하지만 문자 "t"에는 작동하지 않는 이유는 무엇입니까?

awk -F가 대부분의 문자에는 작동하지만 문자 "t"에는 작동하지 않는 이유는 무엇입니까?
 July 2022      mac os Monterey V12.1 
   awk --version 20200816
   GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin21)

awk -F대부분의 문자에는 작동하지만 문자에는 작동하지 않는 이유는 무엇입니까 t? 해결책이 있지만 왜 awk가 letter에 실패하는지 알고 싶습니다 t.

# Count 'e's
% echo "tweeter" | awk -F "e" '{print NF-1}'
3

# Count 'r's
% echo "tweeter" | awk -F "r" '{print NF-1}'
1

# (Attempt to) count 't's
% echo "tweeter" | awk -F "t" '{print NF-1}'
0   <=== ????

# Use gsub()
% echo "tweeter" | awk '{print gsub(/t/, "")}'
2

답변1

왜냐하면:

일반적으로 공백 수에 관계없이 필드를 구분합니다. 필드 구분 기호를 단일 공백으로 설정하려면 값과 함께 -F 옵션을 사용합니다 [ ]. 필드 구분 기호가 지정된 경우 tawk는 이를 \t지정된 대로 처리하고 <TAB>을 필드 구분 기호로 사용합니다. 리터럴을 필드 구분 기호로 사용하려면 t값과 함께 -F 옵션을 사용하십시오 [t].

그게 출신이야FreeBSD awk 매뉴얼 페이지, macOS와 함께 제공되는 유틸리티는 일반적으로 일부 오래된 FreeBSD 버전 등입니다.

$ printf 'foo\tbar\n' | awk -F t '{print NF-1}'
1
$ echo total | awk -F '[t]' '{print NF-1}'
2

어떤 면에서 이는 탭으로 구분된 값이 있는 파일에 대한 유용한 약칭처럼 보이지만 있는 그대로 사용되는 다른 문자의 경우 혼란스럽습니다. 와 같이만 작동하고 -F사용 -v FS=t하지 않습니다.

이 기능은 POSIX가 아닙니다.POSIX 라고이는 -F x와 동일합니다 -v FS=x. 내가 테스트한 대부분의 다른 awk는 t리터럴 처리(gawk, mawk 및 Busybox의 일부 버전)를 테스트했습니다.

예를 들어 Debian의 awk 버전은original-awk(아마도 Brian W. Kernighan의 이니셜에서 유래한 "One True AWK" 또는 "BWK awk")는 이를 지원하며 적어도Wikipedia에 따르면이것은 FreeBSD에서 사용하는 것과 동일한 소프트웨어입니다. 이 버전은 1988년 책 "The AWK 프로그래밍 언어"에 설명된 버전을 기반으로 한 것으로 보이지만 저는 awk 계보에 대한 전문가가 아니며 그 이후로 크게 발전했는지도 모르겠습니다. 저것깃허브에서, 그러나 거기에 있는 문서에는 기능이 설명되어 있지 않은 것 같습니다. 이것특별한 상황은 코드를 참조하세요.(댓글에서 "사마귀"로 설명됨)

그러나 BWK-awk 호환 모드에서 GNU awk를 사용하면 동일한 동작을 얻을 수 있습니다.:

특별한 경우로, 호환 모드(명령줄 옵션 섹션 참조)에서 -F에 대한 인수가 "t"이면 FS는 TAB 문자로 설정됩니다. 따옴표 없이 쉘에 "-F\t"를 입력하면 "\"가 제거되므로 awk는 실제로 필드를 "t" 대신 탭으로 구분하려고 한다고 생각할 것입니다.

답변2

이것전적으로쉘/환경 조합에 관계없이 가장 안전한 방법은 탭에 사각형 케이지와 이중 백슬래시를 사용하는 것입니다.

FS='[t]'         # for just lowercase "t"
FS='[\\411]'     # for the tab "\t"

작은 따옴표 안에 있어도 \\, 작은 따옴표 안에 있어도 환경이 너무 똑똑해져서 그 중 하나를 제거하려고 하면 awk여전히 탭 자체로서 기본 바이트가 됩니다.

당신이라면 어떨까요?진짜그것에 대해 편집증을 갖고 그렇게 하세요

FS='[\534\564]'  # for the tab "\t"

관련 정보