각 행에서 중복된 값 찾기

각 행에서 중복된 값 찾기

중복(x2) 값이 있는 행을 인쇄하는 방법은 무엇입니까?

예를 들어

01 02 03
01 01 03
01 01 01 03

이 세 줄 중 두 번째 줄만 정확합니다.

이제 x3 값이 발생하는 행을 찾고 싶다고 가정해 보겠습니다.

이 경우 3행이 정확합니다.

답변1

awk를 사용하세요

awk -v nb=3 '{for(i=1;i<=NF;i++)if(++a[$i]>nb){print;next}}' infile

for(i=1;i<=NF;i++)는 ++a[$i] 행의 모든 ​​필드에 있는 연관 배열 a의 모든 필드를 가져오고
동일한 값을 가진 필드를 볼 때마다 이를 증가시킵니다.
if(++a[$i]>nb) 값이 nb보다 크면
{print;next} 줄을 인쇄하고 다음 줄로 이동합니다.


행만 표시nb

awk -v nb=3 '
{
    max = 0
    delete a
    for ( i=1 ; i<=NF ; i++ )
        ++a[$i]
    for( j in a )
        max = a[j]>max ? a[j] : max
    if ( max == nb )
        print
}' infile

답변2

AWK 사용:

awk -v t=2 '{for (i=1; i<=NF; i++) c[$i]++; for (v in c) if (c[v] == t) {print; next}}'

이는 각 행을 처리하고 각 행 내에서 연관 배열의 각 값(각 필드)의 발생 횟수를 계산 c한 다음 표시되는 모든 값을 반복 v하고 그 중 하나가 필요한 횟수만큼 표시되면(지정됨) 대상에 의해 t), 라인을 여러 번 인쇄하는 것을 피하기 위해 라인을 인쇄하고 다음 라인으로 점프합니다(예를 들어을 위한 01 01 03 03).

답변3

이렇게 하면 공백으로 구분된 단어가 반복되는 줄만 인쇄됩니다.

while IFS='' read -r line ; do  if [[ "`echo $line | tr ' ' '\n'| sort | uniq -d`" != '' ]]; then echo "$line"; fi; done < YOURFILE

귀하의 예를 들어, 출력은 다음과 같습니다

01 01 03

01 01 01 03

여기서 2행과 3행에서 "01"이 여러 번 나타나는 경우...

단어의 반복 여부를 확인해야 하는 횟수를 지정하려면 다음을 수행하세요.

NO=3; lnr=1 ; while IFS='' read -r line ; do echo "for line" $lnr ; echo $line | tr ' ' '\n' | uniq -c| grep -e "^\s*$NO" ; ((lnr++)); done < YOURFILE

귀하의 예에서 출력은 다음과 같습니다.

1호선의 경우

2호선

3호선

 3 01

NO첫 번째 숫자는 확인할 변수에 지정한 발생 횟수입니다.
두 번째 숫자는 중복되지 않은 것으로 밝혀진 실제 단어입니다.
물론 YOURFILE을 귀하의 파일로 변경하십시오.

관련 정보