Bash 考虑到第一列(UNIX shell)的字符串值,如何对一组列进行行号
有人能帮我吗?我想对UNIX中的表格文件进行编号,具体取决于该文件中的列。但是,某些行的最后一列之间的字母和长度相同,但顺序不同,如果前面的其他列也相同,则必须将其视为相同。总之,输入类似于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
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