如何解决通过使用可能的数组在 awk 中以困难模式分析两列进行计数
我有一个大问题。我尝试创建一个脚本,它计算特定的总和(水桥的总和没关系)。这是我的数据文件的一小部分
POP62 SOL11
KAR1 SOL24
KAR5 SOL31
POP17 SOL42
POP15 SOL2
POP17 SOL2
KAR7 SOL42
KAR1 SOL11
KAR6 SOL31
在第一列中,我有带有 KAR1、POP17 等数字的 POP 或 KAR。在第二列中,我总是带有一个数字的 SOL,但我最多有 2 个相同的 SOL(例如,我可以有最多 2 个 SOL42 或 SOL11 等,KAR 和 POP 我可以超过 2 个)。
现在是我想做的事情。 如果我发现同一个 SOL 与 KAR 和 POP(无论数字)都连接,我加 1。例如:
KAR6 SOL5
POP8 SOL5
总和加一
在我的数据中
POP62 SOL11
KAR1 SOL24
KAR5 SOL31
POP17 SOL42
POP15 SOL2
POP17 SOL2
KAR7 SOL42
KAR1 SOL11
KAR6 SOL31
我应该有 sum = 2 ,因为
POP17 SOL42
KAR7 SOL42
和
POP62 SOL11
KAR1 SOL11
你知道怎么做吗?我考虑使用 NR=FNR 并检查文件两次并检查 $2 中的重复,也许使用数组,但接下来怎么办?
#!/bin/bash
awk 'NR==FNR ??
some condition {sum++}
END {print sum}' test1.txt{,} >> water_bridges_x2.txt
编辑解决方案 如果为空,我也添加 0,因为我想打印 0 而不是 null
awk '
{
s = $1
sub(/[0-9]+$/,"",s) # strip digits from end in var s
if ($2 in map && map[$2] != s) # if existing entry is not same
++sum # increment sum
map[$2] = s
}
END {print sum+0}' file
2
解决方法
你可以试试这个awk
:
awk '
{
s = $1
sub(/[0-9]+$/,"",s) # strip digits from end in var s
if ($2 in map && map[$2] != s) # if existing entry is not same
++sum # increment sum
map[$2] = s
}
END {print sum+0}' file
2
,
对于您展示的示例,这是另一种方法。在 GNU awk
中编写和测试,应该适用于任何 awk
。
awk '
{
match($1,/^[a-zA-Z]+/)
val=substr($1,RSTART,RLENGTH)
if(($2 in arr) && arr[$2]!=val){
sum++
}
arr[$2]=val
}
END{
print sum
}
' Input_file
,
对@anubhava 的类似回答:这将 GNU awk 用于多维数组:
gawk '
{sols[$2][substr($1,3)] = 1}
END {
for (sol in sols)
if ("POP" in sols[sol] && "KAR" in sols[sol])
sum++
print sum
}
' file
,
另一种解决方案
$ sed -E 's/[0-9]+ +/ /' file | # cleanup data
sort -k2 | # sort by key
uniq | # remove dups
uniq -c -f1 | # count by key
egrep '^ +2 ' -c # report the sum where count is 2.
2
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。