대용량 텍스트 파일에서 이상한 문자 감지

대용량 텍스트 파일에서 이상한 문자 감지

전체 파일에 "A", "T", "G", "C" 4개의 문자만 포함되어 있는지 확인해야 합니다. 나는 sed를 사용하여 문자를 분할한 다음 grep -o 및 -v를 사용하여 확인 대상 문자를 제외했습니다.

Linux에서 이 작업을 수행하는 간단하고 직접적인 방법이 있습니까? sed/awk/grep을 사용하시나요?

(이 관련 질문에 대한 제안이 있는 것 같지만 명령에 전체 텍스트가 포함되어 있습니다. 이에 비해 내 파일 크기가 너무 큽니다.)

예를 들어, 입력 파일에는 4개의 라인이 있고 해당 라인에 다른 문자(ATGC 제외)가 있을 수 있습니다. 가능하다면 홀수 문자를 감지하여 홀수 문자와 해당 문자가 있는 줄 번호를 표시하고 싶습니다.

입력하다:

ATTGTAAGGTAAGTGGATTYTCCGGGRETC
TTVGGATCGTTGACCAGTK
GCCCGGGCCGGTCCTTTGGTGCGTGGGG
CTCTCCCAACCCCCCCACCCTCGACCTGAGCTCAGGCXC

원하는 출력:

1:Y
1:R
1:E
2:V
2:K
4:X

답변1

-N각 출력 줄 앞에 1부터 시작하는 줄 번호를 추가합니다.
-영형일치하는 부분만 인쇄됩니다.
[^ATGC] 문자를 제외합니다.

grep -no '[^ATGC]' file

답변2

파일이 많고 대부분이 유효한 경우 사전 확인을 수행하는 효율적인 방법이 있습니다. 유효하지 않은 문자만 세어보세요. 문자가 없으면 파일을 더 정확하게 테스트할 필요가 없습니다. tr유효한 것을 삭제하고 wc -c다른 것을 계산하는 데 사용됩니다 .

개수가 0이 아닌 경우에는 보다 정확한 보고가 필요합니다.

awk를 사용하고 FS(필드 구분 기호)를 "FS=[^ATGC]+"로 정의하는 것이 좋습니다. 이는 "A, T, G 또는 C가 아닌 모든 문자 시퀀스"를 의미합니다. 한 줄에 오류 문자가 없으면 필드가 하나만 있는 것입니다.

필드가 여러 개인 경우 분할()의 GNU/awk 확장을 사용할 수 있습니다. 이는 각 필드 구분 기호의 정확한 텍스트를 제공합니다.

#! /bin/bash

Awk='
BEGIN { FS = "[^ATGC]+"; }

function Show (tx, Local, f, c, fTxt, fSep) {
    split (tx, fTxt, FS, fSep)
    for (f = 1; f in fSep; ++f) {
        c += length (fTxt[f]);
        printf ("File %s Line %d Column %d Has :%s:\n",
            FILENAME, FNR, 1 + c, fSep[f]);
        c += length (fSep[f]);
    }
}
NF > 1 { Show( $0); }
'
    for fn in q??; do
        cc="$( tr -d 'ATGC\n' < "${fn}" | wc -c )"
        (( cc == 0 )) && { echo "$fn is OK"; continue; }
        awk "${Awk}" "${fn}"
    done

그리고 테스트하세요:

Paul--) head q??
==> q01 <==
TTGTAAGGTAAGTGGATTYTCCGGGRETC
TTVGGATCGTTGACCAGTK
GCCCGGGCCGGTCCTTTGGTGCGTGGGG
CTCTCCCAACCCCCCCACCCTCGACCTGAGCTCAGGCXC
BAACCCCZ

==> q02 <==
GCCCGGGCCGGTCCTTTGGTGCGTGGGG

==> q03 <==
TTGTAAGGTAAGTGGATTYTCCGGGRETC
Paul--) 
Paul--) ./qFix q01 q02 q03
File q01 Line 1 Column 19 Has :Y:
File q01 Line 1 Column 26 Has :RE:
File q01 Line 2 Column 3 Has :V:
File q01 Line 2 Column 19 Has :K:
File q01 Line 4 Column 38 Has :X:
File q01 Line 5 Column 1 Has :B:
File q01 Line 5 Column 8 Has :Z:
q02 is OK
File q03 Line 1 Column 19 Has :Y:
File q03 Line 1 Column 26 Has :RE:
Paul--) 

관련 정보