ファイル全体に「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
他のものを計算するために使用されます。
数がゼロでない場合は、より正確な報告が必要です。
awkを使用してフィールド区切り記号(FS)を「FS = [^ ATGC] +」として定義することをお勧めします。これは、「A、T、G、またはC以外のすべての文字シーケンス」を意味します。 1行にエラー文字がない場合は、1つのフィールドしかありません。
複数のフィールドがある場合は、分割()の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--)