如何打印以下行的长度大小

时间:2018-04-06 09:43:17

标签: awk formatting

我想通过使用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),但如何在同一行打印?

由于

2 个答案:

答案 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>