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
답변
regex=/^[a-zA-Z]+\S+/수단 "비교 $0로 /^[a-zA-Z]+\S+/하고 변수에 결과 저장 regex"그래서 regex그 과제의 결과로 1 또는 0이됩니다 우리가에있어 이후 BEGIN어떤 라인을 읽고되지 않았다 그래서 $ 0 비우 여전히 섹션, 그것은 동등이다 regex=0.
\S는 GNU 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
이것은 awk 패턴이 아닙니다 (perl처럼 보입니다) :
regex=/^[a-zA-Z]+\S+/
다음과 같이 작동합니다.
regex="^[a-zA-Z]+[^[:space:]]+"
또한 패턴은 $0(아님 $1) 과 일치해야합니다 . $0전체 라인입니다. $1첫 번째 필드입니다 ( 각 줄 의 첫 번째 단어 로 생각하십시오 : #첫 번째 열에 일치 할 항목 이 없을 수 있음 ).
이 두 가지 수정으로 귀하의 모범이 저에게 효과적입니다 ...