저는 유닉스를 처음 접했습니다. 혼자 배우고 있어요... 디렉토리에 있는 여러 파일에서 검색하여 지정된 시간에 근무 중인 딜러의 이름을 추출하는 간단한 쉘 스크립트를 작성하고 있습니다.
아이디어는 파일 날짜(예: 0310) 또는 파일의 시간(예: 05) 또는 파일의 시간 유형(AM 또는 PM)을 전달하여 근무 중이던 특정 딜러를 끌어낼 수 있어야 한다는 것입니다. 그때.
다음 스크립트를 사용하여 데이터를 추출할 수 있습니다.
grep -i '05' 0310* | awk -F " " '{print $(01) , $(02) , $(05) , $(06)}' | grep -i am > Dealers_working_during_losses.txt
그러면 오전 5시에 파일 이름 0310_Dealer_Analytic에 나열된 모든 딜러의 이름이 제공됩니다. 이제 누구나 스크립트를 사용할 수 있도록 날짜, 시간, 시간 유형을 매개변수로 제공할 수 있도록 스크립트를 생성해야 합니다. 진행 방법을 알려주십시오. 저는 꿀벌을 처음 접하기 때문에 복잡한 것보다 논리를 이해할 수 있도록 간단한 솔루션에 감사하겠습니다 ...
아래는 샘플 파일 데이터입니다. 룰렛 딜러에 대한 데이터를 추출하면 됩니다.
Hour AM/PM BlackJack_Dealer_FNAME LAST Roulette_Dealer_FNAME LAST Texas_Hold_EM_dealer_FNAME LAST
12:00:00 AM Izabela Parrish Marlene Mcpherson Madina Britton
01:00:00 AM Billy Jones Saima Mcdermott Summer-Louise Hammond
02:00:00 AM Summer-Louise Hammond Abigale Rich John-James Hayward
03:00:00 AM John-James Hayward Evalyn Howell Chyna Mercado
답변1
먼저 기존 스크립트를 정리하겠습니다.
1) -i
grep의 arg는 소문자 비교를 위한 것이므로 숫자에 사용하는 것은 의미가 없습니다. 그러니 그냥 제거하세요 -i
from grep -i '05' 0310*
.
2) " "
는 awk의 기본 FS 값이므로 지정할 필요가 없습니다 -F " "
. 그냥 제거하면 됩니다.
3) 입력 필드 번호는 2자리일 필요가 없으며, 괄호로 묶어 구분할 필요도 없으므로 각 등은 등이 $(01)
될 수 있습니다 .$1
4) awk를 사용하면 grep이 필요하지 않으므로 다음과 같습니다.
grep '05' 0310* |
awk '{print $1, $2, $5, $6}' |
grep -i am > Dealers_working_during_losses.txt
다음과 같이 쓸 수 있습니다:
awk '/05/{$0=$1 OFS $2 OFS $5 OFS $6; if (tolower($0) ~ /am/) print}' 0310* > Dealers_working_during_losses.txt
이제 기존 오류를 수정해 보겠습니다.
5) /05/
찾을 것이다05
어딘가에레코드(예: 분 필드)에 있지만 시간 지정이 있는 레코드의 시작 부분에서만 찾고 싶으므로 로 변경합니다 /^05/
.
6) 마찬가지로 grep -i am
완료 한 대로 기록의 어느 곳에서나(예: 사람 이름) 찾을 tolower($0) ~ /am/
수 있지만 am
기록의 두 번째 필드인 경우에만 찾고 싶으므로 다음으로 변경합니다.tolower($2) == "am"
이제 다음 명령이 있습니다.
awk '/^05/{$0=$1 OFS $2 OFS $5 OFS $6; if (tolower($2) == "am") print}' 0310* > Dealers_working_during_losses.txt
하지만 오전 또는 오후에만 테스트하므로 $2
테스트하고 인쇄하기 전에 완전히 새로운 기록($0)을 만들 필요는 없으며 대신 다음과 같이 할 수 있습니다.
awk '/^05/{if (tolower($2) == "am") print $1, $2, $5, $6}' 0310* > Dealers_working_during_losses.txt
다음과 같이 좀 더 관용적으로 쓸 수 있습니다.
awk '/^05/ && (tolower($2) == "am") {print $1, $2, $5, $6}' 0310* > Dealers_working_during_losses.txt
이제 모든 값 인수를 허용하는 쉘 스크립트를 작성하는 방법을 보여 드리겠습니다. 그건:
#!/usr/bin/env bash
awk -v time="$2" -v ampm="$3" '($0 ~ ("^"time)) && (tolower($2) == tolower(ampm)) {print $1, $2, $5, $6}' "$1"* > Dealers_working_during_losses.txt
위의 내용이 foo
이라는 실행 파일에 저장되어 있다고 가정하면 PATH
다음과 같이 호출할 수 있습니다.
foo 0310 05 am
위에서 명확하지 않은 유일한 점은 리터럴 값( ^05
) 을 테스트하여 "^"
문자열을 변수 값과 연결하여 생성된 문자열로 이동할 때 시간 비교를 위해 다른 구문을 사용해야 한다는 time
것입니다. 정규식 컨텍스트 문자열에서 다음을 사용해야 합니다.동적 정규식/.../
이는 또한 상수 정규식 비교의 단축키를 사용할 수 없음을 의미하므로 해당 부분도 $0 ~ /.../
작성해야 합니다 .$0 ~