행을 특정 횟수만큼 반복 유지[반복]

행을 특정 횟수만큼 반복 유지[반복]

여러 열이 포함된 파일이 있고 열 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

스크립트 는 awkc열 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. 이 경우 반복할 필요조차 없지만 grep3으로 시작하지만 30과 같이 더 큰 값을 가져오지 못하도록 마스크해야 합니다.

awk '{print $3}' yourInputFile | sort | uniq -c | grep '^\s*3\s' | awk '{print $2}'

두 경우 모두 출력은 다음과 같습니다.

APPLE

관련 정보