여러 열이 포함된 파일이 있고 bash 스크립트를 사용하여 특정 열 값(열 3-6)을 복사하는 행을 식별했습니다.
입력 예:
A B C D E F G
1 2 T TACA A 3 2 Q
3 4 I R 8 2 Q
9 3 A C 9 3 P
8 3 I R 8 2 Q
두 개의 중복 값 인스턴스를 표시할 수 있습니다. 다른 열 값(1, 2, 7+열)은 두 행 간에 다를 수 있으므로 두 인스턴스를 모두 확인해야 합니다.
고유한 레코드를 저장하고 싶고 이러한 중복 항목을 정렬한 후 중복 레코드의 첫 번째 인스턴스가 열 5(모든 순서 가능)로 정렬된 다음 열 1(내림차순 --> 가장 큰 첫 번째 값)으로 정렬되었습니다.
원하는 출력:
A B C D E F G
1 2 T TACA A 3 2 Q
9 3 A C 9 3 P
8 3 I R 8 2 Q
참고: 최종 출력의 순서는 나중에 정렬되므로 중요하지 않습니다. 필요한 행이 존재하는지 확인하는 것이 중요합니다.
지금까지 내 코드는 다음과 같습니다
tot=$(awk 'n=x[$3,$6]{print n"\n"$0;} {x[$3,$6]=$0;}' oldfilename | wc -l) #counts duplicated records and saves overall count as $tot
if [ $tot == "0" ]
then
awk '{print}' oldfilename >> newfilename #if no dups found, all lines saved in new file
else if
awk '(!(n=x[$3,$6]{print n"\n"$0;} {x[$3,$6]=$0;})' oldfilename >> newfilename #if dups found, unique lines in old file saved in new file
else
awk 'n=x[$3,$6]{print n"\n"$0;} {x[$3,$6]=$0;}' oldfilename > tempfile #save dups in tempfile
sort -k1,1, -k5,5 tempfile #sort tempfile on cols 1 then 5 (want descending order)
fi
내가 할 수 없는 일은 각 복제본의 첫 번째 인스턴스를 가져와 새 파일에 저장하는 것입니다. 하지만 위 코드에는 여전히 오류가 있습니다.
도와주세요.
답변1
sort
그 자체로는 충분합니다. 먼저 행이 필드 범위별로 "그룹화"되도록 정렬되고 3-6
, 각 그룹 내의 레코드는 필드 합계를 기준으로 추가로 5
정렬 됩니다 1
. sort -u
최후 3-6
의 수단 비교를 비활성화하고 3-6
각 그룹의 첫 번째 레코드를 반환하는 파이프입니다 . 마지막으로 sort
이번에는 필드 5
와1
sort -k3,6 -k5,5r -k1,1r file | sort -k3,6 -u | sort -k5,5r -k1,1r
A B C D E F G
1 2 T TACA A 3 2 Q
9 3 A C 9 3 P
8 3 I R 8 2 Q
답변2
내가 올바르게 이해했다면 이것으로 충분할 것입니다.
$ sort input | uniq -f 2
1 2 T TACA A 3 2 Q
3 4 I R 8 2 Q
9 3 A C 9 3 P
A B C D E F G
이 -f 2
스위치는 uniq
처음 2개 필드 비교를 건너뛰도록 지시합니다. 따라서 마지막 3개 필드의 중복 항목 중 첫 번째 인스턴스가 유지됩니다.