我正在开发一个简单的脚本来逐行读取文件,评估每行的内容,并根据行号处理行数据。出于某种原因,我无法获得匹配空格的正则表达式。 [:space:],[[:space:]],[:blank:],\ s,\,和“”都失败了。
我的数据格式如下(fastq格式):
@SRR573708.2 2 length=100
AAAACGTTAATATTTATTGAAATTGTT
+SRR573708.2 2 length=100
HHHHHHHHHHHHHHHHHHHHHHHHHHH
我想将其重新格式化为:
@SRR573708.2/2
AAAACGTTAATATTTATTGAAATTGTT
+SRR573708.2/2
HHHHHHHHHHHHHHHHHHHHHHHHHHH
然而,重要的是,在将其打印到新文件之前,我检查每一行以确保其格式正确。我最后一次尝试生成重新格式化的文件,在文件末尾产生了一些非常棒的结果。我的代码是:
i=1
while read LINE; do
if (( $i > 4 )); then break; fi
if (( $i % 4 == 1 )); then
if [[ $data =~ ^@SRR[0-9]{6}[[:blank:]] ]]; then
awk -v IFS=" " -v OFS="" -v ORS="" -v SUFFIX=$SUFFIX -v OUTPUT_FILE=$OUTPUT_FILE ' {print $1,SUFFIX,"\n" } ' <<< $data
i=$(( $i + 1 ))
else
echo -e "error at line ${i}"; echo "${data}"; exit 1; fi
elif (( $i % 4 == 2 )); then echo -e "$LINE"
i=$(( $i + 1 ))
elif (( $i % 4 == 3 )); then
echo $data
awk -v IFS=" " -v OFS="" -v ORS="" -v SUFFIX=$SUFFIX -v OUTPUT_FILE=$OUTPUT_FILE ' {print $1,SUFFIX,"\n" } ' <<< $data
i=$(( $i + 1 ))
elif (( $i % 4 == 0 )); then echo -e "$LINE"
i=$(( $i + 1 ))
else
echo -e "number of liness is not divisible by 4. Program Terminated.\nProblem encountered at line ${i}."
exit 1
fi
done < $INPUT_FILE
我收到错误消息:
error at line 1
@SRR573708.2 2 length=100
有关如何匹配正则表达式if语句中的空格的任何建议,最好只匹配空格和制表符而不是换行符。
答案 0 :(得分:0)
下面是一个正在运行的awk代码(虽然它不像rici的代码那样优雅和简化):
awk -v i=1 -v IFS=" " -v OFS="" -v ORS="" -v SUFFIX=$SUFFIX -v OUTPUT_FILE=$OUTPUT_FILE -v nchars=0 -v DIRECTION=$DIRECTION ' {
if (i%4==1 && $0~/^@SRR[0-9][0-9][0-9][0-9][0-9][0-9]\.[0-9]+\.$DIRECTION[[:blank:]][0-9]+[[:blank:]]length=100$/)
{ printf "%s%s\n",$1,SUFFIX >> OUTPUT_FILE; i++ }
else if (i%4==2 && $0~/^[AGCTNagctn\-]+$/)
{ nchars=length($0);printf "%s\n",$1 >> OUTPUT_FILE;i++ }
else if (i%4==3 && $0~/^\+SRR[0-9][0-9][0-9][0-9][0-9][0-9]\.[0-9]+[[:blank:]][0-9]+[[:blank:]]length=100$/)
{ printf "%s%s\n",$1,SUFFIX >> OUTPUT_FILE; i++}
else if (i%4==0 && $0~/.*/ && nchars==length($0))
{ printf "%s\n",$1 >> OUTPUT_FILE;i++}
else
{printf "error at line %s:\n%s\n\n",i,$0; exit 1}
}' $INPUT_FILE