전체 파일에 "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--)