使用 AWK 从 X 行到 Y 行计算每列的模式

Counting Pattern Per Column From Line X to Y Using AWK

我有一个如下所示的文件:

Sample_ID Population CP026243.1_309     CP026243.1_318  CP026243.1_427  CP026243.1_449  CP026243.1_515
Turbot-BalticSea_01     BalticSea       0       0       0
Turbot-BalticSea_02     BalticSea       -1      -1      -1
Turbot-BalticSea_03     BalticSea       -1      -1      0
Turbot-BalticSea_04     BalticSea       0       0       -1
Turbot-BalticSea_05     BalticSea       -1      -1      0
Turbot-BalticSea_06     BalticSea       -1      0       0
Turbot-BalticSea_07     BalticSea       -1      -1      -1
Turbot-BalticSea_08     BalticSea       0       0       0
Turbot-BalticSea_09     BalticSea       0       0       1
Turbot-BalticSea_10     BalticSea       0       0       0
Turbot-BalticSea_11     BalticSea       -1      -1      1
Turbot-BalticSea_12     BalticSea       0       0       0
Turbot-BalticSea_13     BalticSea       0       0       0
Turbot-BalticSea_14     BalticSea       0       1       -1
Turbot-BalticSea_15     BalticSea       0       0       0
Turbot-BalticSea_16     BalticSea       0       0       0
Turbot-BalticSea_17     BalticSea       0       0       -1
Turbot-Kattegat_01      Kattegat        0       -1      0
Turbot-Kattegat_02      Kattegat        -1      -1      0
Turbot-Kattegat_03      Kattegat        -1      -1      -1
Turbot-Kattegat_04      Kattegat        0       0       0
Turbot-Kattegat_05      Kattegat        -1      -1      -1
Turbot-Kattegat_06      Kattegat        -1      -1      -1

我想知道如何计算每个人口(波罗的海/卡特加特海峡)每列(从第 3 列和第二行开始)中“-1”的数量。

我猜 AWK 适合做这个?

cat TEMP.tsv | awk 'NR>1{...}'

提前致谢,乔治。

使用 awk 你可以做这样的事情:

tail -n +2 TEMP.tsv | awk '=="-1" { count[]++ } END {for (word in count) print word, count[word]}'

计算第 3 列中 -1 的出现次数,按第 2 列值分组。

请注意,tail 命令删除了 header。

awk 命令中的 $3 正在检查第三列。第四、第五列使用 $4、$5 等等..

要使用单个 awk 脚本为所有列执行此操作,请创建一个文件,例如 grpbycount.awk:

BEGIN {}
{
  for ( counter = 3; counter <=NF; counter++ ) {
   if ($counter=="-1") count[counter","]++
  }
}
END {
  for ( word in count) print word, count[word]
}

然后使用这个命令:

tail -n +2 TEMP.tsv | awk -f grpbycount.awk | sort

根据您的输入,计算结果如下

3,BalticSea 6
3,Kattegat 4
4,BalticSea 5
4,Kattegat 5
5,BalticSea 5
5,Kattegat 3

第一个数值是列号,后面是第 2 列的值,然后打印计数。