데이터가 있고 결론을 도출하기 위해 문장을 요약하고 싶습니다. 아래 예는 데이터와 관련이 없으며, 아이디어를 명확히 하여 재현할 수 있습니다.
Employee Suzie signed one time.
Employee Dan signed one time.
Employee Jordan signed one time.
Employee Suzie signed one time.
Employee Suzie signed one time.
Employee Harold signed one time.
Employee Sebastian signed one time.
Employee Jordan signed one time.
Employee Suzie signed one time.
Employee Suzan signed one time.
나는 이 문장들을 다음과 같이 요약하고 싶습니다.
Jordan signed 2 time(s)
Dan signed 1 time(s)
Suzie signed 4 time(s)
Suzan signed 1 time(s)
Sebastian signed 1 time(s)
Harold signed 1 time(s)
가지고 놀았 awk
지만 하기 어려울 것 같습니다. 그런 다음 sed
성공하지 못했습니다. 그것은 sed
단지 사물을 발견하고 변화시키는 것 같습니다.
답변1
일반적인 방법은
$ awk '{ count[$2]++ }
END {
for (name in count)
printf("%s signed %d time(s)\n", name, count[name])
}' <file
Harold signed 1 time(s)
Dan signed 1 time(s)
Sebastian signed 1 time(s)
Suzie signed 4 time(s)
Jordan signed 2 time(s)
Suzan signed 1 time(s)
즉, 연관 배열/해시를 사용하여 특정 이름이 표시된 횟수를 저장합니다. END
블록 에서 모든 이름을 반복하고 각 이름의 요약을 인쇄합니다.
더 나은 형식을 지정하려면 호출 %s
에서 자리 표시자를 변경하여 이름(왼쪽 맞춤)에 10자를 예약하세요 printf()
.%-10s
$ awk '{ count[$2]++ }
END {
for (name in count)
printf("%-10s signed %d time(s)\n", name, count[name])
}' <file
Harold signed 1 time(s)
Dan signed 1 time(s)
Sebastian signed 1 time(s)
Suzie signed 4 time(s)
Jordan signed 2 time(s)
Suzan signed 1 time(s)
출력을 좀 더 조작해 보겠습니다(심심해서).
$ awk '{ count[$2]++ }
END {
for (name in count)
printf("%-10s signed %d time%s\n", name, count[name],
count[name] > 1 ? "s" : "" )
}' <file
Harold signed 1 time
Dan signed 1 time
Sebastian signed 1 time
Suzie signed 4 times
Jordan signed 2 times
Suzan signed 1 time
답변2
연관 배열을 사용할 때 awk
이는 보유한 메모리 크기에 따라 제한되며 다음을 수행할 수 있습니다.
sort -k2,2 infile | uniq -c
또는 필요에 따라 형식을 지정합니다.
sort -k2,2 infile |uniq -c |awk '{ print $3, "signed", $1, "time(s)" }'
답변3
이 작업은 을(를) 위한 것입니다 . 이 작업 을 수행하려면 awk
다음이 필요합니다 .array[index]
awk 'NF {name[$2]++} END{for (each in name) {print each " signed " name[each] " time(s)"}}' file
Jordan signed 2 time(s)
Dan signed 1 time(s)
Suzie signed 4 time(s)
Suzan signed 1 time(s)
Sebastian signed 1 time(s)
Harold signed 1 time(s)
NF
여분의 빈 줄을 제거하면 됩니다. 데이터는 배열의 인덱스와 값에 저장됩니다. 값은 해당 색인으로 참조됩니다.
답변4
나는 "for" 솔루션을 시도했지만, 이 솔루션을 다시 편집하여 멋지게 만들 수 있다고 확신합니다. 그러나 여전히 목표를 달성했습니다.
for name in $(awk '{print $2}' x.txt)
do
count=$(grep -i $i x.txt|wc -l)
echo "$i signed in $count times" >>xy.txt
done
sort -u xy.txt
Dan signed in 3 times
Harold signed in 1 times
Jordan signed in 2 times
Sebastian signed in 1 times
Suzan signed in 1 times
Suzie signed in 4 times