다음 예를 사용하세요.
#submission,date
"test1","22 April 2024"
"test2","24 April 2024"
"test3","25 March 2024"
"test6","01 April 2023"
"test7","02 April 2022"
"test8","03 April 2021"
이 글을 쓰는 시점에서 2024년 4월인 해당 달의 테스트만 인쇄하고 싶습니다. 다음 명령을 시도해 보십시오:
awk -F, -v date="$(date +'%B %Y')" '/^[^#]/ && $2 ~ /'$date'\"$/{print $1}' tests.csv
모든 테스트를 인쇄합니다. Awk를 사용하여 Bash 변수를 비교하는 방법은 무엇입니까?
답변1
정보 How are variables ...
- 생각, 코드, 질문에서 "변수"가 무엇을 의미하는지 매우 명확하게 설명하세요. 쉘, bash에서 awk를 호출하고 있습니다. Bash는 awk가 아닙니다. 두 가지 완전히 독립적인 도구로 각각 고유한 구문, 의미, 범위를 갖습니다.그리고 변수.
귀하의 코드에는 다음이 있습니다.
awk -v date="$(date +'%B %Y')"
채우기awk 변수는 쉘 변수가 아니며 다른 Unix 도구에 대한 호출 출력을 포함합니다 date
.
awk와 마찬가지로 C
awk에서는 이름만 사용하여 변수의 값을 얻을 수 있지만, 쉘에서는 $
값을 얻으려면 변수 이름 앞에 a를 넣어야 합니다. 따라서 코드의 다음 부분은 다음과 같습니다.
$2 ~ /'$date'\"$/
date
awk 변수의 값을 얻으려면 이를 사용해야 date
하지만 이제 두 번째 문제가 발생합니다. 내부에서 사용합니다.리터럴 정규식구분 기호가 있지만 변수와 문자열로 정규식을 구성 /.../
해야 하므로date
\"$
동적 정규식문자 그대로의 정규 표현식은 없습니다. 이를 감안할 때 코드의 이 부분은 다음과 같아야 합니다.
$2 ~ (date "\"$")
이를 감안할 때 스크립트는 다음과 같습니다.
$ awk -F, -v date="$(date +'%B %Y')" '/^[^#]/ && $2 ~ (date "\"$"){print $1}' tests.csv
"test1"
"test2"
date
하지만 저라면 첫 번째 초기화에서 정규식을 만들기 위해 연결하겠습니다.
awk -F, -v date="$(date +'%B %Y')\"$" '/^[^#]/ && $2 ~ date{print $1}'
또는 다음 BEGIN
섹션에서:
awk -F, -v date="$(date +'%B %Y')" 'BEGIN{date=date "\"$"} /^[^#]/ && $2 ~ (date "\"$"){print $1}'
따라서 문자열 연결은 상대적으로 느린 작업이므로 입력 줄당 한 번만 발생하지 않습니다.
GNU awk가 있는 경우 또 다른 옵션은 저장하는 것입니다.강력한 형식의 정규식 상수변수의 동적 정규식 문자열 대신 date
:
awk -F, -v date="@/$(date +'%B %Y')[^\"]+\"$/" '/^[^#]/ && $2 ~ date{print $1}' file
또는:
awk -F, -v d="$(date +'%B %Y')" 'BEGIN{date=@/x[^"]+"$/; sub(/x/,d,date)} /^[^#]/ && $2 ~ date{print $1}' file
그러나 두 번째는 다소 신비스러워집니다. 평범하고 오래된 동적 정규식은 특정 경우에 잘 작동합니다.
awk 스크립트에서 쉘 변수의 값을 실제로 사용하려면 다음을 참조하세요.awk 스크립트에서 쉘 변수를 사용하는 방법어떻게 해야 하나요?