awk 스크립트가 해시 기호 '#'을 캡처하지 않습니다.

awk 스크립트가 해시 기호 '#'을 캡처하지 않습니다.

다른 모든 레코드는 유지하면서 주석으로 시작하는 레코드를 무시하도록 awk에 어떻게 지시할 수 있나요? 다음 awk 스크립트는 이 샘플 테스트 파일에서 해시 기호로 시작하는 레코드를 무시하지 않습니다. 녹음 도 건너뜁니다 numpy.

테스트 파일
# Version numbers have been retrieved from a range of machines and environments.
# Take them with a grain of salt.

# Direct dependencies
#python==3.6.0
#pip==9.0.1
#setuptools==38.2.4  # old for MarkupSafe 1.0 (28.8.0 is installed with py 3.6)
numpy==1.12.1  # 1.12.0
pandas==0.19.2
awk 스크립트
#! /usr/bin/awk -f

BEGIN { 
  regex=/^[a-zA-Z]+\S+/ 
  n=0
}

$1 ~ regex {print $1; n++};

END{
  {print "\n# \n# End proccessing of "FILENAME" \n# Original file had "NR" records\n# Current file record count is "n};
  { if(NR>=n) print "#\n# Mattached all records"};
}
출력(막대 무시)
|| #python==3.6.0
|| #pip==9.0.1
|| pandas==0.19.2
|| 
|| # 
|| # End proccessing of requirements.txt 
|| # Original file had 9 records
|| # Current file record count is 3
|| #
|| # Mattached all records

답변1

regex=/^[a-zA-Z]+\S+/"결과를 비교 $0하고 /^[a-zA-Z]+\S+/결과를 변수에 저장 regex" 을 의미하므로 regex할당된 결과는 1 또는 0이 되며 BEGIN아직 행을 읽지 않은 섹션에 있으므로 $0은 여전히 ​​비어 있으므로 다음과 같습니다. regex=0.

\SGNU awk 확장입니다. 즉, [^[:space:]]GNU awk를 사용하는 경우 강력한 형식의 정규식 상수도 지원합니다(참조:https://www.gnu.org/software/gawk/manual/gawk.html#Strong-Regexp-Constants). 이를 염두에 두고 다음을 수행할 수 있습니다(기호 참조 @).

$ seq 5 | awk 'BEGIN{re=@/3/} $0 ~ re'
3

그러나 GNU awk에서만 가능합니다.

다른 awk 변형(이 버전을 사용한다고 가정하면 20070501BSD 변형을 사용하고 있는 것으로 의심됩니다)에서 가장 좋은 방법은 동적 정규식을 사용하는 것입니다.

$ seq 5 | awk 'BEGIN{re="3"} $0 ~ re'
3

답변2

이것은 awk 모드가 아닙니다(Perl과 유사함).

regex=/^[a-zA-Z]+\S+/ 

다음과 같이 작동합니다.

regex="^[a-zA-Z]+[^[:space:]]+"

또한 패턴이 일치해야 합니다 $0( 가 아님 $1). $0전체 라인입니다. $1첫 번째 필드입니다(첫 번째 필드로 간주).단어한 줄에: 아마도 없음#첫 번째 열의 내용과 일치합니다).

이 두 가지 수정 사항을 통해 귀하의 예가 저에게 효과적입니다 ...

관련 정보