我想在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