Bash 考虑到第一列(UNIX shell)的字符串值,如何对一组列进行行号

Bash 考虑到第一列(UNIX shell)的字符串值,如何对一组列进行行号,bash,for-loop,unix,awk,Bash,For Loop,Unix,Awk,有人能帮我吗?我想对UNIX中的表格文件进行编号,具体取决于该文件中的列。但是,某些行的最后一列之间的字母和长度相同,但顺序不同,如果前面的其他列也相同,则必须将其视为相同。总之,输入类似于 rs758613821 574290 insertion_inframe P 285 AAAP rs758613821 574290 insertion_inframe P 285 APAA rs758613821 574290 insertion_infr

有人能帮我吗?我想对UNIX中的表格文件进行编号,具体取决于该文件中的列。但是,某些行的最后一列之间的字母和长度相同,但顺序不同,如果前面的其他列也相同,则必须将其视为相同。总之,输入类似于

rs758613821  574290     insertion_inframe   P   285  AAAP
rs758613821  574290     insertion_inframe   P   285  APAA
rs758613821  574290     insertion_inframe   P   285  APLA
rs1367252071 574290     deletion_inframe    CADDL   134  F
rs538        3246       frameshift_variant  F   97  FGLYP
rs538        3246       frameshift_variant  F   97  PYFLG
输出应该是

1 rs758613821    574290     insertion_inframe   P   285  AAAP
1 rs758613821    574290     insertion_inframe   P   285  APAA
2 rs758613821    574290     insertion_inframe   P   285  APLA
3 rs1367252071   574290     deletion_inframe    CADDL   134  F
4 rs538          3246       frameshift_variant  F   97  FGLYP
4 rs538          3246       frameshift_variant  F   97  PYFLG
等等

通过这种方式,我执行了如下代码

awk 'BEGIN {FS=OFS="\t"} function intern(sym) { if (sym in table)
                          return table[sym]
                        return table[sym] = ++counter }
 { print intern($1"\t"$2"\t"$3"\t"$4"\t"$5"\t"$6), $0 }' "input" > "output";

尽管如此,我并没有解决关于最后一列的问题,即如果字母和长度相同,但顺序不同,则分配相同的数字。是否可以在UNIX环境中执行此操作?我想可能是通过substr函数或类似的方法,但我不确定什么是正确的代码。提前感谢您的支持和帮助

不确定这是您想要做的,但请尝试一下

$ awk 'function canon(f) {n=split(f,a,""); 
                          asort(a); c=""; 
                          for(i=1;i<=n;i++) c=c a[i]; 
                          return c;}
                         {key=canon($NF)} 
          !(key in keys) {keys[key]=++ctr} 
                         {print keys[key],$0}' file

1 rs758613821  574290     insertion_inframe   P   285  AAAP
1 rs758613821  574290     insertion_inframe   P   285  APAA
2 rs758613821  574290     insertion_inframe   P   285  APLA
3 rs1367252071 574290     deletion_inframe    CADDL   134  F
4 rs538        3246       frameshift_variant  F   97  FGLYP
4 rs538        3246       frameshift_variant  F   97  PYFLG

复制行,用规范形式替换最后一个字段,使用更新的行作为键,统计唯一实例,打印计数和原始行

正常工作!非常感谢@karafka,不过我还需要考虑其他专栏。这样,如果第2行的第3列与前一行不同,则编号也必须不同,并将变为编号2而不是编号1。是否有可能将其包含在代码中以将其考虑在内?不过,再次感谢您的帮助!好的,我已经解决了。足够的replace key=canon($NF)到key=canon($0)来考虑其他列。我理解代码的大部分内容,但有些部分让我感到困惑。能不能表面上解释一下?别那样做,它可能会给你错误的匹配。请查看更新的版本。让我知道哪个部分不清楚。是的,正确。由于最后一个字段字符的顺序并不重要,因此最简单的方法是对它们进行排序和比较。非常感谢您的更正并重新编辑标题@gregory
                 ...
                 {line=$0;
                  $NF=canon($NF);
                  key=$0} 
  !(key in keys) {keys[key]=++ctr} 
                 {print keys[key],line}' file