计算第 2 列中与第 1 列相似的条目数

计算第 2 列中与第 1 列相似的条目数

我正在尝试计算同一列 1 的第 2 列中的条目数,以及类似的列 1 的第 2 列中的第一个条目出现的次数。

例如我的输入 TSV 文件是:

C1  NC01
    NC01
C2  NC01
    NC01
    NC02
C3  NC01
    NC02
    NC03

我想要的输出是:

C1  NC01  2  2
    NC01
C2  NC01  3  2
    NC01
    NC02
C3  NC01  3  1
    NC02
    NC03

我如何使用命令行执行此操作?

答案1

使用awk

awk '{a[NR]=$0} {if(NF!=1){y=$2;x=$0;b[x]=1;c[x]=1}else{b[x]++;if(y==$1){c[x]++}}} END{for (n in a){z=a[n];print z" "b[z]" "c[z]}}' file

诚然,这不是最简单的,但根据您给定的输入,它对我有用。

解释:

  • {a[NR]=$0}:首先将文件的所有内容加载到名为 的数组中a
  • if(NF!=1):如果一行有多列(多于一列)...
  • {y=$2;x=$0;b[x]=1;c[x]=1}: ... 将变量设置y为我们要计数的第二列值,并将变量设置x为整行。这些变量将在以后的迭代中使用。这些值也是两个数组b和中的索引c,我们在其中存储计数值。
  • else{b[x]++;if(y==$1){c[x]++}}:如果一行只有一列,我们将增加b数组中的值。如果该列与我们保存在 中的主行中的第二列匹配y,我们也会增加该值。
  • END{for (n in a){z=a[n];print z" "b[z]" "c[z]}}:最后,我们循环遍历数组a并打印它的值(这是文件内容的简单转储)。我们还打印其他两个数组b和中的计数值c

输出给出:

C1  NC01 2 2
    NC01
C2  NC01 3 2
    NC01
    NC02
C3  NC01 3 1
    NC02
    NC03

相关内容