수십억 개의 행이 있는 TSV 파일의 열을 필터링하는 방법

수십억 개의 행이 있는 TSV 파일의 열을 필터링하는 방법

저는 수십억 행의 데이터가 포함된 목록으로 작업하고 있습니다.

다음과 같은 데이터가 있습니다. 여기에 이미지 설명을 입력하세요

보시다시피 네 번째 열(유전자 열)에는 유전자 이름이 있지만 모든 행에 "유전자 이름"이 있는 것은 아닙니다. 네 번째 열에서 "유전자 이름"의 전체 목록을 가져와야 합니다.

필요한 것을 어떻게 얻을 수 있나요?

답변1

다음 한 줄로 시도해 보세요.

cut -f4 in.tsv | tail -n +2 | grep -P '\S'

세부사항:
cut -f4 in.tsv: 입력 파일의 TAB으로 구분된 네 번째 열을 출력합니다 in.tsv.
tail -n +2: 첫 번째 줄(헤더)을 제거합니다.
grep -P '\S': 공백이 아닌 문자가 있는 줄만 유지합니다. 즉, 빈 줄을 제거합니다. Perl 정규식을 사용하라고 -P지시합니다 .grep

고유한 유전자 이름만 필요한 경우 sort -u다음과 같이 추가하세요.

cut -f4 in.tsv | tail -n +2 | grep -P '\S' | sort -u

답변2

귀하의 요구 사항이 무엇인지 명확하지 않습니다. 첫 번째 행을 제외하고 네 번째 열("gene"로 표시)의 값만 있다고 가정하면, 여섯 번째 열("product"로 표시)의 값은 "가설 단백질"과 다릅니다.

grep -v "hypothetical protein" < <(tail -n +2 file.tsv) | cut -f4 -d$'\t'

설명

tail -n +2 file.tsv

첫 번째 행("locus_tag", "type" 등)을 제외합니다.

grep -v "hypothetical protein"

"가설 단백질" 문자열을 포함하는 모든 행을 제외합니다.

cut -f4 -d$'\t'

네 번째 열을 인쇄합니다.

답변3

이것은 에 대한 작업인 것 같습니다 awk. 다음을 시도해 볼 수도 있습니다.

awk '{if ($4); print $4 $7}' filename.tsv

의견의 유용한 제안을 따르십시오.

awk 'BEGIN { FS = "\t" } ; $4 != "" { print $4 "\t" $7}'

답변4

awk 사용:

awk -F'\t' '$4 != "" {arr[$4] = 1} END {for (idx in arr) print idx}' file.tsv
  • -F'\t': 탭으로 분할됩니다.
  • $4 != "": 4번째 필드가 비어 있지 않은 경우…
  • {arr[$4] = 1}: ...배열 할당에서 인덱스로 사용합니다.
    • 동일한 인덱스의 후속 인스턴스는 배열 항목을 덮어쓰며 중복 항목은 저장되지 않습니다.
    • 할당된 값( 1)은 임의적 0이거나 "blergh"잘 작동합니다.
  • END: 모든 줄을 읽었을 때…
  • {for (idx in arr) print idx}: ...모든 인덱스를 인쇄합니다.

관련 정보