【发布时间】:2021-06-06 03:44:38
【问题描述】:
我想在 awk 中遍历数组中的所有元素并打印。这些值来自以下文件:
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{***} 命令)
根据How to view all the content in an awk array?,上面的语法应该可以工作。我在这里尝试过echo -e "1 2\n3 4\n5 6" | awk '{my_dict[$1] = $2};END {for(key in my_dict) print key " : " my_dict[key],": "length(my_dict)}',效果很好。
【问题讨论】:
-
您只将 1 个文件(在您最初的问题中,后来您更改为 2 个文件)传递给您的 awk,现在我可以看到您正在将 2 个文件传递给 awk 程序。如果您只是想从 1 个文件中打印数组项,能否请您告诉我?如果是这种情况,那么我们不需要使用第二个文件。
-
您的编辑无法解释第二个文件包含的内容。无论如何,您的代码完全忽略了第二个文件。
-
我想用第一个输入文件
$input1来构建一个awk数组。然后我将使用数组 in 对 file2.gsub(key, codes[key], $3)中的一个字段进行 gsub 处理。我的困惑在于数组codes,它似乎不允许我遍历它的所有 27 个元素。如果需要,我可以提供指向第二个文件/我所有 AWK 代码的链接 -
另外,你的代码根本不像你说的那样做。请edit提供minimal reproducible example。
-
您的代码采用制表符分隔的列,但您的示例数据似乎在列之间有空格。如果您真的想处理空格分隔的数据,请取出
FS="\t"。 (即使那样,您的代码也只处理两列,而您的数据有三列。)
标签: arrays awk bioinformatics