여러 개의 파일이 있고 각 파일은 다음과 같습니다.
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
:
데이터는 첫 번째 필드를 기준으로 정렬됩니다.
첫 번째 필드의 너비는 일정합니다.
그러면 다음을 대신 사용할 수 있습니다.
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은 중복 행(c[]) 수를 계산하는 데 사용됩니다.
- 행의 정렬 순서(s[])
- 자신을 위한 행(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]++
첫 번째 필드의 첫 번째 항목만 캡처됩니다 .