첫 번째 열 값의 복사본이 하나만 포함된 행만 인쇄합니다.

첫 번째 열 값의 복사본이 하나만 포함된 행만 인쇄합니다.

여러 개의 파일이 있고 각 파일은 다음과 같습니다.

HWI-ST913:300:C5W5DACXX:7:1101:1477:2147    Ha1_00044161    80.6    31  6   0   94  2   1   31  5.1e-11 63.2
HWI-ST913:300:C5W5DACXX:7:1101:1629:2128    Ha6_00047653    90.9    33  3   0   2   100 173 205 5.1e-11 63.2
HWI-ST913:300:C5W5DACXX:7:1101:1649:2180    Ha9_00011743    100.0   33  0   0   100 2   274 306 7.8e-12 65.9
HWI-ST913:300:C5W5DACXX:7:1101:1649:2180    Ha5_00006578    100.0   33  0   0   100 2   98  130 7.8e-12 65.9
HWI-ST913:300:C5W5DACXX:7:1101:1649:2180    Ha12_00033467   100.0   33  0   0   100 2   91  123 7.8e-12 65.9
HWI-ST913:300:C5W5DACXX:7:1101:6099:2062    B2KZF9_PICAB    100.0   33  0   0   1   99  73  105 2.4e-13 70.9
HWI-ST913:300:C5W5DACXX:7:1101:6891:2170    Ha2_00026275    87.9    33  4   0   2   100 27  59  9.3e-13 68.9
HWI-ST913:300:C5W5DACXX:7:1101:6891:2170    Ha13_00015465   87.9    33  4   0   2   100 884 916 9.3e-13 68.9
HWI-ST913:300:C5W5DACXX:7:1101:6891:2170    Ha17_00009154   87.9    33  4   0   2   100 420 452 9.3e-13 68.9

첫 번째 열이 고유한 행만 유지하고 싶습니다. 이것이 내가 원하는 결과입니다:

HWI-ST913:300:C5W5DACXX:7:1101:1477:2147    Ha1_00044161    80.6    31  6   0   94  2   1   31  5.1e-11 63.2
HWI-ST913:300:C5W5DACXX:7:1101:1629:2128    Ha6_00047653    90.9    33  3   0   2   100 173 205 5.1e-11 63.2
HWI-ST913:300:C5W5DACXX:7:1101:6099:2062    B2KZF9_PICAB    100.0   33  0   0   1   99  73  105 2.4e-13 70.9

답변1

KISS 방법 awk: 행 배열과 개수를 유지한 다음 최종 개수가 1인 행만 인쇄합니다.

awk '{a[$1]=$0; c[$1]++} END{for (i in a) {if (c[i] == 1) print a[i]}}' file

uniq-w또는 ( ) 옵션을 지원하는 버전이 있는 경우 --check-chars:

  1. 데이터는 첫 번째 필드를 기준으로 정렬됩니다.

  2. 첫 번째 필드의 너비는 일정합니다.

그러면 다음을 대신 사용할 수 있습니다.

uniq -uw 40 file
HWI-ST913:300:C5W5DACXX:7:1101:1477:2147    Ha1_00044161    80.6    31  6   0   94  2   1   31  5.1e-11 63.2
HWI-ST913:300:C5W5DACXX:7:1101:1629:2128    Ha6_00047653    90.9    33  3   0   2   100 173 205 5.1e-11 63.2
HWI-ST913:300:C5W5DACXX:7:1101:6099:2062    B2KZF9_PICAB    100.0   33  0   0   1   99  73  105 2.4e-13 70.9

이는 응용 프로그램에 중요한 경우 원본 파일의 순서를 유지한다는 장점이 있습니다.

답변2

한 가지 방법은 이것이었을 수 있습니다. 동일한 파일을 이중 구문 분석해야 하지만 결과는 순차적으로 인쇄됩니다.

$ awk 'NR==FNR{f1[$1]++;next}f1[$1]==1' file1 file1
HWI-ST913:300:C5W5DACXX:7:1101:1477:2147    Ha1_00044161    80.6    31  6   0   94  2   1   31  5.1e-11 63.2
HWI-ST913:300:C5W5DACXX:7:1101:1629:2128    Ha6_00047653    90.9    33  3   0   2   100 173 205 5.1e-11 63.2
HWI-ST913:300:C5W5DACXX:7:1101:6099:2062    B2KZF9_PICAB    100.0   33  0   0   1   99  73  105 2.4e-13 70.9

답변3

입력 파일이 정렬되어 있다는 점만 고려하면 다음은 모든 POSIX 호환 시스템에 적용됩니다.

sed 's/ .*//' file.txt | uniq -u | join - file.txt

원본 문서의 공백 구분 기호가 실제로 탭 문자인 경우 sed호출을 탭 문자로 바꾸고 cut -f1 file.txt나머지는 변경하지 않고 그대로 둘 수 있습니다.

답변4

파일을 한 번만 검사그리고입력 파일과 동일한 순서로 고유 라인을 인쇄하려면 다음을 사용하십시오.

GNU awk에서(배열의 정렬된 스캔을 보장하기 위해 "sorted_in" 사용): 세 가지 배열을 사용합니다.

  1. 1은 중복 행(c[]) 수를 계산하는 데 사용됩니다.
  2. 행의 정렬 순서(s[])
  3. 자신을 위한 행(v[])

마지막으로 개수가 1인 줄만 인쇄됩니다.

awk 'BEGIN { PROCINFO["sorted_in"] = "@ind_num_asc" ; i=0}
        !c[$1]++{s[++i]=$1;v[i]=$0}
     END{for(i in v){if(c[s[i]]==1){print v[i]}}}' infile

!c[$1]++첫 번째 필드의 첫 번째 항목만 캡처됩니다 .

관련 정보