![한 파일에서 다른 파일의 패턴 발생 횟수를 계산하는 우아한 방법](https://linux55.com/image/6960/%ED%95%9C%20%ED%8C%8C%EC%9D%BC%EC%97%90%EC%84%9C%20%EB%8B%A4%EB%A5%B8%20%ED%8C%8C%EC%9D%BC%EC%9D%98%20%ED%8C%A8%ED%84%B4%20%EB%B0%9C%EC%83%9D%20%ED%9A%9F%EC%88%98%EB%A5%BC%20%EA%B3%84%EC%82%B0%ED%95%98%EB%8A%94%20%EC%9A%B0%EC%95%84%ED%95%9C%20%EB%B0%A9%EB%B2%95.png)
두 개의 샘플 파일이 있다고 가정해 보겠습니다. 첫 번째 파일은 이름의 처음 두 문자와 성의 마지막 두 문자를 결합하여 생성된 고유한 직원 이름으로 채워집니다.Example : Peter Smith - Peht
첫 번째 파일에는 다음이 포함됩니다.
Peht
Mawo
Stso
Makr
Bavo
두 번째 파일에는 시스템에 로그인한 시간에 대한 기록이 포함되어 있습니다. (분명히 목록에 없는 직원도 있습니다 file1
.)
두 번째 파일:
Mawo 21.4.2016 17:49
Peht 21.4.2016 17:58
Mawo 22.4.2016 7:58
Wato 22.4.2016 7:59
Stso 22.4.2016 8:02
Bavo 22.4.2016 8:15
Bane 22.4.2016 9:01
Bavo 23.4.2016 9:12
Mawo 23.4.2016 9:24
Dalo 23.4.2016 9:54
Peht 23.4.2016 9:58
Grma 24.4.2016 10:00
file1의 직원이 시스템에 몇 번 () 연결했는지 알아내야 합니다
file2
.
가장 좋은 접근 방식은 무엇입니까? 내가 생각할 수 있는 유일한 해결책은 2개의 루프를 수행하는 것입니다. 루프의 각 이름 에 대해 이름이 일치하는지(그렇다면) 물어 file1
보십시오 . 가능 하다면 누군가 나에게 이 문제를 해결할 수 있는 우아한 해결책을 줄 수 있습니까 ?file2
grep
count++
awk
답변1
다음과 같은 간단한 것:
mapfile -t names < file1
for name in "${names[@]}"
do
echo "${name}" $(grep -c "^$name " file2)
done
다음 출력을 제공합니다.
Peht 2
Mawo 3
Stso 1
Makr 0
Bavo 2
grep string은 줄의 시작 부분(^)에 사용자 이름을 고정하고 줄 뒤에 공백을 강제 적용하는 것을 의미합니다.
답변2
테스트.awk:
FNR == NR{
names[$1]
next
}
($1 in names){
ulog[$1]++
}
END{
for(name in ulog){
print name ":" ulog[name]
}
}
다음과 같이 실행하십시오.
awk -f test.awk user.list user.log
FNR==NR # 파일 레코드 번호 == 레코드 번호, 그렇다면 여전히 첫 번째 파일에 있습니다.
next # 아직 첫 번째 파일에 있으므로 나머지는 건너뛰고 다음 줄을 가져옵니다.
나머지는 자명해야합니다.
아니면 한 줄로
awk 'FNR == NR{ names[$1]; next } ($1 in names){ ulog[$1]++ } END{ for(name in ulog){ print name ":" ulog[name] } }' user.list user.log
답변3
//를 join
수행 하는 또 다른 방법은 다음과 같습니다 .sort
uniq
join -1 1 -2 2 -a1 -e "0" -o 1.1 2.1 <(sort file1) \
<(cut -d' ' -f1 file2 | sort | uniq -c)
기본적으로 이름을 UE 이름 file1
과 uniq
연결하고 file2
사용 0
중인 누락된 필드를 기준으로 계산합니다 file2
.
나는 awk
다음을 실행할 것이다:
awk 'NR==FNR{s[$1]++;next}
{if ($1 in s) {print $1, s[$1]}
else {print $1, 0}}' file2 file1
먼저 read 를 실행하고 file2
, 각 이름의 발생 횟수를 세고, 그런 다음 file1
각 이름의 개수를 읽고 인쇄합니다 file2
(또는 file2
이름이 해당 이름에 없으면 0을 인쇄합니다).