![열 값을 교환할 수 있는 경우 첫 번째 중복 인스턴스 유지](https://linux55.com/image/73685/%EC%97%B4%20%EA%B0%92%EC%9D%84%20%EA%B5%90%ED%99%98%ED%95%A0%20%EC%88%98%20%EC%9E%88%EB%8A%94%20%EA%B2%BD%EC%9A%B0%20%EC%B2%AB%20%EB%B2%88%EC%A7%B8%20%EC%A4%91%EB%B3%B5%20%EC%9D%B8%EC%8A%A4%ED%84%B4%EC%8A%A4%20%EC%9C%A0%EC%A7%80.png)
이전에 복제본의 첫 번째 인스턴스를 유지하는 것에 대해 질문했는데 제공된 솔루션이 지금까지 잘 작동하고 있습니다(참조첫 번째 중복 인스턴스 유지).
그러나 이제 C열과 D열의 값이 동일하지만 순서가 다를 수 있는 상황이 발생하여 하나만 유지하고 싶습니다(어느 순서든 괜찮습니다).
입력 예:
A B C D E F G
1 2 T TACA 3 2 Q
9 3 A C 9 3 P
8 3 I R 8 2 Q
9 3 C A 9 3 P
4 8 C T 7 4 P
9 3 T G 9 3 P
원하는 출력:
A B C D E F G
1 2 T TACA 3 2 Q
9 3 A C 9 3 P
8 3 I R 8 2 Q
4 8 C T 7 4 P
9 3 T G 9 3 P
사용: ( sort -k3,4 -k5,5r -k1,1r file | sort -k1,1 -k3,4 -u | sort -k1,1r
또는 유사한) 유지 9 3 A C 9 3 P
및 9 3 C A 9 3 P
버전이지만 그 중 하나만 유지하고 싶습니다. 추가되는 복잡성은 A열의 값이 C열과 D열에 대해 허용되는 여러 값(예: 위의 원하는 출력 예에서 2행 9 3 A C 9 3 P
과 5 행 9 3 T G 9 3 P
)을 가질 수 있으므로 열만을 기준으로 중복 항목을 검색하는 것이 불가능하다는 점입니다. ㅏ .
감사해요!
답변1
awk '{
key1 = $1 FS $2 FS $5 FS $5 FS $7
if ( ((key1 SUBSEP $3 FS $4) in seen) || ((key1 SUBSEP $4 FS $3) in seen) )
next
seen[key1, $3 FS $4] = 1
print
}'
A B C D E F G
1 2 T TACA 3 2 Q
9 3 A C 9 3 P
8 3 I R 8 2 Q
4 8 C T 7 4 P
9 3 T G 9 3 P