쉘 스크립트는 연속된 일수만 계산합니다.

쉘 스크립트는 연속된 일수만 계산합니다.

이 일을 어떻게 해야 하는지 알고 싶습니다.

내 출력의 예는 다음과 같습니다.

Sun Aug 21 2016 03:00:00, BLAH
Mon Aug 22 2016 03:54:00, BLAH
Tue Aug 23 2016 04:22:11, BLAH
Thu Aug 25 2016 05:00:00, BLAH

이제 내가 하고 싶은 것은 숫자를 세는 것뿐이다계속해서BLAH일이므로 위의 예에서는 연이어 나타나기 때문에 3번 나타난다 고 해야 합니다 .

bash, awk 및 sed를 사용할 수 있습니다.

답변1

AWK에서는:

{
    sub(",", "", $0);  # kill first comma, thanks Thomas
    cmd="date -d \""$1" "$2" "$3" "$4" "$5" 1 day ago\" \"+%b %e\"";
    cmd|getline dt;
    close(cmd);
    if (dt==prev && blah==substr($0, index($0, $6))) { times = times + 1 }
    else { print times" "line; times = 1 };
    prev=$2" "$3;
    blah=substr($0, index($0,$6));
    line=$0;
}
END { print times" "line }

다음과 같은 파일에 이 입력이 있다고 가정해 보겠습니다 blah.log.

Sun Aug 21 2016 03:00:00, BLAH
Mon Aug 22 2016 03:54:00, BLAH
Tue Aug 23 2016 04:22:11, BLAH
Thu Aug 25 2016 05:00:00, BLAH

awk 스크립트에서는 consecutive.awk다음을 수행할 수 있습니다.

$ awk -f consecutive.awk blah.log

3 Tue Aug 23 2016 04:22:11 BLAH
1 Thu Aug 25 2016 05:00:00 BLAH

연속된 일수를 추가 열로 제공하고 마지막 날짜를 인쇄합니다. 출력에서 날짜를 제거하려면 (두 위치 모두에 표시됨) print times" "line로 변경하면 됩니다.print times" "blah

작동 방식:

  • Glenn jackman 덕분에 날짜 명령을 실행하여 현재 행의 어제를 가져옵니다.
  • 이전 행에 저장된 날짜와 비교
  • 카운터 증가 또는 인쇄
  • 다음 실행을 위해 현재 행의 데이터를 저장합니다.

노트:

  • 보기 흉합니다(모든 AWK 코드가 그렇듯, 극복하세요).
  • 를 사용하므로 모든 간격(최대 1년)에 대해 잘 작동 date하지만 시간대를 무시합니다.
  • BLAH는 다른 라인에서 다를 수 있다는 점을 고려하고 BLAH 발생을 다른 BLAH 발생과만 일치시킵니다. 파일이 올바르게 정렬되지 않은 경우 sort -t , -k 2.
  • BLAH의 다양한 값을 설명해야 한다면 GNU awk가 필요합니다(호출해 주셔서 감사합니다 substr). 그렇지 않으면 호출을 종료할 수 substr있으며 스크립트는 모든 posix awk에서 실행됩니다.

답변2

생각보다 시간이 더 걸렸지만 아래 스크립트가 해당 작업을 수행합니다.

#!/bin/bash
str=" Sun Aug 21 2016 03:00:00, BLAH Mon Aug 22 2016 03:54:00, BLAH"
str+=" Tue Aug 23 2016 04:22:11, BLAH Thu Aug 25 2016 05:00:00, BLAH"
IFS='H' read -r -a inputArray <<< "$str"
days=(SunMon MonTue TueWed WedThu ThuFri FriSat SatSun)
count=1
found=0
lastOne=""
finalCount=0
for entry in "${inputArray[@]}"; do
   thisOne="${entry:1:3}"
   test="$lastOne$thisOne"
   for pair in "${days[@]}"; do
      if [ "$test" == "$pair" ]; then
         ((++count, ++found))
      fi
   done
   if [ ! $found ]; then count=1; else found=0; fi
   if [ $count -gt $finalCount ]; then
      finalCount=$count
   fi
   lastOne=$thisOne
done
echo "There were $finalCount BLAHs in a row."

관련 정보