我正在尝试计算同一列 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