이 일을 어떻게 해야 하는지 알고 싶습니다.
내 출력의 예는 다음과 같습니다.
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."