저는 다음과 유사한 10,000개가 넘는 행의 샘플 데이터를 사용하여 작업하고 있습니다.
hxxp://google.com
hxxp://google.com "Seen"
hxxp://yahoo.com "Check again"
hxxp://yahoo.com
hxxp://about.com
hxxp://x.com
hxxp://y.com
hxxp://z.com
hxxp://reddit.com
hxxp://a.com "good"
hxxp://a.com
hxxp://b.com "good"
hxxp://c.com
hxxp://c.com "good"
hxxp://c.com
나는 이러한 결과를 달성하는 방법을 찾기 위해 고심해 왔습니다.
hxxp://google.com "Seen"
hxxp://yahoo.com "Check again"
hxxp://about.com
hxxp://x.com
hxxp://y.com
hxxp://z.com
hxxp://reddit.com
hxxp://a.com "good"
hxxp://b.com "good"
hxxp://c.com "good"
샘플 데이터에는 중복된 행이 있을 수 있습니다. 중복된 행이 있는 경우 두 번째 열이 누락된 행을 삭제합니다. 구분 기호는 공백입니다.
awk -F' ' '!seen[$1]++' dupe.txt > clean.txt
이건 나에게 딱 맞는 안감은 아닌 것 같다.
답변1
$ LC_ALL=C sort -r <file | LC_ALL=C sort -k1,1 -us
hxxp://a.com "good"
hxxp://about.com
hxxp://b.com "good"
hxxp://c.com "good"
hxxp://google.com "Seen"
hxxp://reddit.com
hxxp://x.com
hxxp://y.com
hxxp://yahoo.com "Check again"
hxxp://z.com
첫 번째는 sort
전체 줄을 정렬 키로 사용하여 파일을 역순으로 정렬합니다. 이렇게 하면 중간 결과가 생성됩니다.
hxxp://z.com
hxxp://yahoo.com "Check again"
hxxp://yahoo.com
hxxp://y.com
hxxp://x.com
hxxp://reddit.com
hxxp://google.com "Seen"
hxxp://google.com
hxxp://c.com "good"
hxxp://c.com
hxxp://c.com
hxxp://b.com "good"
hxxp://about.com
hxxp://a.com "good"
hxxp://a.com
주어진 샘플 데이터. 추가 주석이 포함된 줄은 항상 추가 주석이 없는 해당 줄보다 앞에 있다는 점에 유의하세요.
두 번째는 sort
고유한 정렬 키가 있는 행만 생성합니다. 첫 번째 필드(URL)만 정렬 키로 사용합니다. 또한 sort
"안정적인" 정렬 알고리즘을 사용해야 합니다 -s
. 이는 동일한 키를 가진 행의 순서가 입력 순서를 변경하지 않음을 의미합니다.
-u
조합은 -s
중복된 URL이 포함된 추가 주석 행만 제공합니다.
이 비트는 적절한 로케일을 확보하여 행이 제대로 작동하도록 올바르게 정렬되도록 하기 LC_ALL=C
위한 것입니다 .sort
답변2
샘플에 모든 상태가 포함되어 있고 파일 이름이 Sample.data라고 가정하는 경우:
grep " " Sample.data > Result
cut -d' ' -f1 Result > FirstCol
grep Sample.data -v -f FirstCol >> Result
답변3
다음을 수행할 수 있습니다.
awk '
!($1 in a) || NF > 1 {a[$1] = $0}
END {for (url in a) print a[url]}
' dupe.txt
행의 순서는 유지되지 않습니다.
이렇게 하면 순서가 유지되지만 파일을 2번 통과해야 합니다.
awk '
NR == FNR {
if (!($1 in a) || NF > 1) {a[$1] = $0}
next
}
$0 == a[$1]
' dupe.txt dupe.txt
답변4
perl -lane '
push @h, $F[0] if ! exists $h{$F[0]};
$h{$F[0]} = $_ if ! exists $h{$F[0]} || @F > 1;
}{ print $h{$_} for @h;
' dupe.txt > clean.txt
설명하다:
@h
키(즉, 첫 번째 필드)가 나타나는 순서를 저장합니다.%h
은 첫 번째 필드의 해시 값이고$F[0]
해당 값은 toto의 행입니다.%h
해시는 새 키를 볼 때마다 업데이트되거나 이전 키를 볼 때 행에 여러 필드가 있을 때 업데이트됩니다. 이 경우 업데이트할 시기가 무르익었습니다.- 에서는
eof
단순히 배열에 저장된 키를 반복@h
하고 해당 값을 추출하여 표준 출력으로 보냅니다.
산출:
xxp://google.com "Seen"
hxxp://yahoo.com "Check again"
hxxp://about.com
hxxp://x.com
hxxp://y.com
hxxp://z.com
hxxp://reddit.com
hxxp://a.com "good"
hxxp://b.com "good"
hxxp://c.com "good"