使用 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 列的值,然后打印计数。
我有一个如下所示的文件:
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 列的值,然后打印计数。