我想通过使用awk包含以下行的大小来修改文件。 我的文件是这样的:
>AAAS:1220136:1220159:-:0::NW_015494524.1:1220136-1220159(-)
ATGTCGATGCTCGATC
>AAAS::1215902:1215986:-:1::NW_015494524.1:1215902-1215986(-)
ATGCGATGCTAGCTAGCTCGAT
>AAAS:1215614:1215701:-:1::NW_015494524.1:1215614-1215701(-)
ATGCCGCGACGCAGCACCCGACGCGCAG
我使用awk将其修改为具有以下格式:
>Assembly_AAAS_1_16
ATGTCGATGCTCGATC
>Assembly_AAAS_2_22
ATGCGATGCTAGCTAGCTCGAT
>Assembly_AAAS_3_28
ATGCCGCGACGCAGCACCCGACGCGCAG
我用awk修改了第一部分。
awk -F":" -v i=1 '/>/{print ">Assembly_" $1 "_" val i "_";i++;next} {print length($0)} 1' infile | sed -e "s/_>/_/g" > outfile
我可以使用打印长度($ 0),但如何在同一行打印?
由于
答案 0 :(得分:2)
EDIT2: 由于OP已再次更改了示例数据,因此现在添加此代码。
awk -v val="Assembly_AAAS_" '/>/{++i;val=">"val i "_";next} {sub(/ +$/,"");print val length($0) ORS $0}' Input_file
<强> OR 强>
awk -v val="Assembly_AAAS_" '/>/{++i;val=">"val i "_";next} {print val length($1) ORS $0;}' Input_file
上面将从Input_file的最后一行中删除空格,如果您不需要,请从上面的代码中删除sub(/ +$/,"");
部分。
编辑: 现在根据OP更改解决方案。
awk -v i=1 -v val=">Assembly_GeneName1_" -v val1="_sizeline" '/>/{value="\047" val i val1;i++;next} {print value length($0) ORS $0}' Input_file
<强> OR 强>
awk -v i=1 -v val=">Assembly_GeneName1_" -v val1="_sizeline" '
/>/{ value="\047" val i val1;
i++;
next}
{
print value length($0) ORS $0
}
' Input_file
关注awk
可能对您有帮助。
awk -v i="" -v j=2 '/>/{print "\047>Assembly_GeneName1_"++i"_sizeline"j;j+=2;next} 1' Input_file
解决方案第二:
awk -v i=1 -v j=2 -v val=">Assembly_GeneName1_" -v val1="_sizeline" '/>/{print "\047" val i val1 j;j+=2;i++;next} 1' Input_file
答案 1 :(得分:1)
你正在处理的是一个非线条记录的漂亮例子。 awk
是记录解析器,默认情况下,记录定义为一行。使用awk
,您可以使用记录分隔符RS
将记录定义为文本块。
RS
:RS
字符串值的第一个字符应为输入记录分隔符;默认情况下为<newline>
。如果RS
包含更多内容 超过一个字符,结果未指定。如果RS
为null,那么 记录由<newline>
加1组成的序列分隔 或多于空白行,不得产生前导或尾随空白行 在输入开头或结尾的空记录中,<newline>
无论FS
的值是什么,都应始终是字段分隔符。
所以目标是将记录定义为
AAAS:1220136:1220159:-:0::NW_015494524.1:1220136-1220159(-)
ATGTCGATGCTCGATC
这可以通过定义RS="\n<"
来完成。此外,我们将\n
用作字段分隔符FS
。这样,您可以使用记录计数length($2)
获取请求的NR
长度和计数。
然后是一个简单的awk
脚本:
awk 'BEGIN{RS="\n<"; FS=OFS="\n"}
{$1=">Assembly_AAAS_"NR"_"length($2)}
{print $1,$2}' <file>
这将完全符合您的要求。
注意:我们使用print $1,$2
而非print $0
,因为最后一条记录可能有3个字段(如果文件的最后一个字符是换行符)。这意味着你的文件末尾会有一个额外的空行。
如果您想从AAAS
中挑选$1
字符串,可以使用substr($1,1,match($1,":")-1)
进行搜索。结果如下:
awk 'BEGIN{RS="\n<"; FS=OFS="\n"}
{$1=">Assembly_"substr($1,1,match($1,":")-1)"_"NR"_"length($2)}
{print $1,$2}' <file>
最后,请注意上述解决方案仅在$2
中没有空格时才有效,如果您想更改它,可以执行此操作:
awk 'BEGIN{RS="\n<"; FS=OFS="\n"}
{ gsub(/[[:blank:]]/,"",$2);
$1=">Assembly_"substr($1,1,match($1,":")-1)"_"NR"_"length($2)
}
{ print $1,$2 }' <file>