在AWK中打印数组中的所有元素



我想在awk和print中循环遍历数组中的所有元素。这些值来自下面的文件:

Ala     A       Alanine
Arg     R       Arginine
Asn     N       Asparagine
Asp     D       Aspartic acid
Cys     C       Cysteine
Gln     Q       Glutamine
Glu     E       Glutamic acid
Gly     G       Glycine
His     H       Histidine
Ile     I       Isoleucine
Leu     L       Leucine
Lys     K       Lysine
Met     M       Methionine
Phe     F       Phenylalanine
Pro     P       Proline
Pyl     O       Pyrrolysine
Ser     S       Serine
Sec     U       Selenocysteine
Thr     T       Threonine
Trp     W       Tryptophan
Tyr     Y       Tyrosine
Val     V       Valine
Asx     B       Aspartic acid or Asparagine
Glx     Z       Glutamic acid or Glutamine
Xaa     X       Any amino acid
Xle     J       Leucine or Isoleucine
TERM    TERM    termination codon

我已经试过了:

awk 'BEGIN{FS="t";OFS="t"}{if (FNR==NR) {codes[$1]=$2;} else{next}}END{for (key in codes);{print key,codes[key],length(codes)}}' $input1 $input2

输出始终是Cys C 27,当我用codes[$1]=$2代替codes[$2]=$1时,我得到M Met 27

我如何使我的代码依次打印出所有的值?我不明白为什么我的代码选择性地打印出只有一个元素,当我可以告诉数组长度是预期的27。(为了保持我的代码最小化,我已经排除了else{next}内的代码-否则我只想从数组codes中打印所有元素,同时保留else{***}命令)

根据如何查看awk数组中的所有内容?上述语法应该可以工作。我在这里试了试echo -e "1 2n3 4n5 6" | awk '{my_dict[$1] = $2};END {for(key in my_dict) print key " : " my_dict[key],": "length(my_dict)}',效果很好。

使用您展示的示例和尝试,请尝试在GNUawk中编写和测试以下内容。

awk '
BEGIN{
FS=OFS="t"
}
{
codes[$1]=$2
}
END{
for(key in codes){
print key,codes[key],length(codes)
}
}' Input_file

将在几分钟内添加详细的解释和OP的错误。

解释:为以上内容添加详细说明。

awk '                     ##Starting awk program from here.
BEGIN{                    ##Starting BEGIN section from here.
FS=OFS="t"             ##Setting FS and OFS as TAB here.
}
{
codes[$1]=$2            ##Creating array codes with index of 1st field and value of 2nd field
}
END{                      ##Starting END block of this program from here.
for(key in codes){      ##Traversing through codes array here.
print key,codes[key],length(codes)  ##Printing index and value of current item along with total length of codes.
}
}' Input_file             ##Mentioning Input_file name here.

我有点困惑你在找什么,但是要按顺序打印代码,用no。,(忽略名称),您可以执行:

awk '{seq[++n]=$2; codes[$2]=$1} 
END{for (i=1;i<=n;i++) printf "%st%st%dn", codes[seq[i]], seq[i], i}' file

使用两个数组将序列号与seq数组中的单个字母进行协调,然后将字母与codes数组中的代码进行协调。

使用/输出示例

$ awk '{seq[++n]=$2; codes[$2]=$1} 
END{for (i=1;i<=n;i++) printf "%st%st%dn", codes[seq[i]], seq[i], i}' file
Ala     A       1
Arg     R       2
Asn     N       3
Asp     D       4
Cys     C       5
Gln     Q       6
Glu     E       7
Gly     G       8
His     H       9
Ile     I       10
Leu     L       11
Lys     K       12
Met     M       13
Phe     F       14
Pro     P       15
Pyl     O       16
Ser     S       17
Sec     U       18
Thr     T       19
Trp     W       20
Tyr     Y       21
Val     V       22
Asx     B       23
Glx     Z       24
Xaa     X       25
Xle     J       26
TERM    TERM    27

已解决:此错误是由于在这里引入;:END{for (key in codes);{print key,codes[key],length(codes)}}而导致的。解决方案:

awk 'BEGIN{FS="t";OFS="t"}{if (FNR==NR) {codes[$1]=$2;} else{next}}END{for (key in codes){print key,codes[key],length(codes)}}' $input1 $input2

相关内容

  • 没有找到相关文章

最新更新