Bash의 첫 번째 열에서 중복 행 제거

Bash의 첫 번째 열에서 중복 행 제거

탭으로 구분된 .txt 파일이 있고 첫 번째 열에서 중복 행을 제거하고 싶습니다. 정렬 없이 이 작업을 수행할 수 있다면 정말 좋겠지만 정렬을 사용해야 한다는 사실을 받아들였습니다. 정렬을 사용하면 제목을 정렬할 수 없으므로 제목이 맨 위에 있어야 합니다.

테스트 데이터 세트(탭으로 구분):

Symbol  ATCACGACAGACAGGT.1  ATCACGACAGCCTATA.1  TTTGTCATCATGTCTT.1  
STPG1   0   1   3
NFYA    0   0   1
STPG1   1   3   1
ABD 0   0   0
ABC 0   0   0

내 꿈의 결과물:

Symbol  ATCACGACAGACAGGT.1  ATCACGACAGCCTATA.1  TTTGTCATCATGTCTT.1  
STPG1   0   1   3
NFYA    0   0   1
ABD 0   0   0
ABC 0   0   0

내 차선책 :

Symbol  ATCACGACAGACAGGT.1  ATCACGACAGCCTATA.1  TTTGTCATCATGTCTT.1  
ABC 0   0   0 
ABD 0   0   0   
NFYA    0   0   1
STPG1   0   1   3

쉼표로 구분된 테스트 예제 testc.txt에서 다음 코드를 사용했지만 헤더는 여전히 정렬 중입니다. 유효한 탭 구분 기호를 할당하는 방법을 찾을 수 없는 것 같습니다. 또한 이 코드의 헤더에 문제가 있습니다.

sort -u -t, -k1,1 testc.txt

실제 데이터 세트에 행, 열 또는 행 이름이 몇 개 있는지 모른다는 점을 분명히 해야 할 것 같습니다.

답변1

여기서 사용할 수 있습니다 awk:

$ awk -F'\t' 'NR==1 || !seen[$1]++' ip.txt
Symbol  ATCACGACAGACAGGT.1      ATCACGACAGCCTATA.1      TTTGTCATCATGTCTT.1
STPG1   0       1       3
NFYA    0       0       1
ABD     0       0       0
ABC     0       0       0
  • -F'\t'탭 문자를 구분 기호로 지정
  • NR==1헤더를 유지합니다(주어진 입력의 경우 필수는 아니지만) - NR은 현재 줄 번호를 갖는 특수 변수입니다.
  • !seen[$1]++여기서 seen배열은 첫 번째 필드를 키로 사용하고 값이 0이면(키가 처음 표시될 때) 조건이 true가 됩니다.

관련 정보