여러 열이 포함된 파일이 있고 열 3의 값이 반복되는 행을 식별했습니다.
입력 예:
A B C
1 2 APPLE
3 4 PEAR
9 3 LEMON
8 3 ORANGE
8 2 APPLE
3 4 APPLE
9 3 LEMON
8 3 PEAR
다음을 사용하여 3열의 단어가 얼마나 자주 반복되는지 계산할 수 있습니다.
awk '{print $3}' [input filename] | sort | uniq -c > [output filename]
산출:
3 APPLE
2 PEAR
2 LEMON
1 ORANGE
내가 원하는 것은 3번 반복되는 행을 유지하는 것입니다.
원하는 출력:
APPLE
또는
1 2 APPLE
8 2 APPLE
3 4 APPLE
모든 열이 원래 입력 파일에서 인쇄되는지 아니면 세 번째 열 값만 인쇄되는지는 중요하지 않습니다.
을 사용하면 sort -u
적어도 한 번 발생하는 모든 줄이 인쇄되는데 이는 내가 원하는 것이 아닙니다.
답변1
또 다른 방법은 파일을 두 번 확인하는 것입니다. 먼저 참조를 작성하고 두 번째로 필요에 따라 필터링합니다.
$ awk 'NR==FNR{a[$3]++; next} a[$3]==3' ip.txt ip.txt
1 2 APPLE
8 2 APPLE
3 4 APPLE
$ awk 'NR==FNR{a[$3]++; next} a[$3]==2' ip.txt ip.txt
3 4 PEAR
9 3 LEMON
9 3 LEMON
8 3 PEAR
$ awk 'NR==FNR{a[$3]++; next} a[$3]<2' ip.txt ip.txt
A B C
8 3 ORANGE
답변2
앗해결책:
-- 발생 항목만 출력적어도3번:
awk '++a[$3]==3{ print $3 }' file
++a[$3]
- 세 번째 필드의 고유 값 개수가 지속적으로 증가합니다.
-- 발생 항목만 출력정확히3번:
awk '{++a[$3]}END{ for(i in a) if(a[i]==3) print i }' file
산출:
APPLE
답변3
파이프의 출력을 전달 awk '$1 == 3 { print $2 }'
하여 APPLE
.
awk
또는 처음부터 계산을 시작하세요.
awk '{ c[$3]++; r[$3] = r[$3] ? r[$3] ORS $0 : $0 } END { for (i in c) { if (c[i] == 3) print r[i] } }' file
1 2 APPLE
8 2 APPLE
3 4 APPLE
스크립트 는 awk
의 c
열 3에 있는 값의 발생 횟수를 계산합니다. 각 입력 행 r
에 연관 배열을 추가합니다. 예를 들어 c
세 번째 열에 입력합니다.
마지막으로 세 번째 열이 정확히 세 번 나타나는 행만 출력됩니다.
답변4
좋습니다. 가장 우아한 방법은 아닐 수도 있지만 다음 방법이 효과적입니다. 각 줄을 구문 분석하여 이미 수행한 작업을 확장합니다.발생 횟수가 2보다 크지 않은 콘텐츠를 필터링합니다..
awk '{print $3}' yourInputFile | sort | uniq -c | while read -r line
do
echo $line | [ `awk '{print $1}'` -gt 2 ] && echo $line | awk '{print $2}'
done
표시를 다음으로 제한하려는 경우발생 횟수가 정확히 3인 행, 훨씬 더 간단합니다. A는 grep
의견에 제안된 대로 사용할 수 있습니다 @wvxvw
. 이 경우 반복할 필요조차 없지만 grep
3으로 시작하지만 30과 같이 더 큰 값을 가져오지 못하도록 마스크해야 합니다.
awk '{print $3}' yourInputFile | sort | uniq -c | grep '^\s*3\s' | awk '{print $2}'
두 경우 모두 출력은 다음과 같습니다.
APPLE