다음과 같은 파일이 주어지면:
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" )에서 키를 반복하고 ( 연산자를
}{
사용하여) 개행 수를 계산합니다 .tr
2 이상이면 저장된 행을 인쇄합니다.
| 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