TSV 파일에서 수십억 행의 열을 필터링하는 방법

TSV 파일에서 수십억 행의 열을 필터링하는 방법

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

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

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

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

답변1

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

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

세부 정보:
cut -f4 in.tsv: 입력 파일의 탭으로 구분된 네 번째 열을 출력합니다 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 != "": 네 번째 필드가 비어 있지 않은 경우...
  • {arr[$4] = 1}: ...배열 할당 시 인덱스로 사용합니다.
    • 동일한 인덱스의 후속 인스턴스는 배열 항목을 덮어쓰며 중복 항목은 저장되지 않습니다.
    • 지정된 값( 1)은 임의적 0이거나 "blergh"정상적으로 작동합니다.
  • END: 모든 줄을 읽었을 때...
  • {for (idx in arr) print idx}: ...모든 인덱스를 인쇄합니다.

관련 정보