특정 열에 중복된 값이 있는 파일의 모든 행을 인쇄하는 방법

특정 열에 중복된 값이 있는 파일의 모든 행을 인쇄하는 방법

다음과 같은 파일이 주어지면:

1,768,12,46576457,7898
1,123,435,134,146
2,345,6756856,12312,1311
5,234,567465,12341,1341
1,3245,4356345,2442,13
9,423,2342,121,463
9,989,342,121,1212

열 1의 값이 적어도 두 번(열 1에서) 나타나도록 모든 행을 (bash 터미널에서) 나열하고 싶습니다. 결과는

1,768,12,46576457,7898
1,123,435,134,146
1,3245,4356345,2442,13
9,423,2342,121,463
9,989,342,121,1212

답변1

전체 파일을 메모리에 저장하지 않으려면 다음을 수행하십시오.

awk -F , '
  !count[$1]++ {save[$1] = $0; next}
  count[$1] == 2 {
    print save[$1]
    delete save[$1]
  }
  {print}'

답변2

펄 솔루션:

perl -F, -ane ' $h{ $F[0] } .= $_
                }{
                $h{$_} =~ tr/\n// >= 2 and print $h{$_} for keys %h
              ' < input-file
  • -n입력을 한 줄씩 읽습니다.
  • -a위의 각 줄 -F(예: 쉼표)을 @F배열로 나눕니다.
  • %h행은 첫 번째 필드( )로 $F[0]입력된 해시에 저장됩니다 . 서로 연결되어 있습니다( .=).
  • 파일 끝("Eskimogreeting" )에서 키를 반복하고 ( 연산자를 }{사용하여) 개행 수를 계산합니다 . tr2 이상이면 저장된 행을 인쇄합니다.

| sort -n첫 번째 열을 숫자로 정렬하려면 출력을 에 제공할 수 있습니다.

주목:마지막 줄이 개행 문자로 끝나지 않으면 해당 그룹은 크기를 1로 보고합니다. chomp각 줄에 줄 바꿈을 직접 추가하거나 문자열 배열 대신 줄 배열을 사용하여 문제를 해결할 수 있습니다 .

답변3

awk 사용(다차원 배열을 위한 GNU awk)

gawk -F, '
    { line[NR] = $0; count[$1]++; found[$1][NR] = 1}
    END {
        for (id in count)
            if (count[id] > 1)
                for (nr in found[id]) 
                    print line[nr]
    }
' file

출력 순서는 입력 파일 순서와 다를 수 있습니다.

답변4

Python 3 사용:

#!/usr/bin/env python3
import sys
from collections import defaultdict

column_delimiter = sys.argv[1]
column = int(sys.argv[2]) - 1

records = defaultdict(list)
for l in sys.stdin:
    l = l.rstrip('\n')
    r = l.split(column_delimiter)
    records[r[column]].append(l)

for ll in records.values():
    if len(ll) > 1:
        print(*ll, sep='\n')

용법:

python3 duplicate-columns.py COLUMN-DELIMITER COLUMN

예:

python3 duplicate-columns.py ',' 1 < data.csv

관련 정보