通过使用可能数组分析 awk 中困难模式中的两列进行计数

Counting by analizing two column in difficult pattern in awk by using probably arrays

我有一个大问题。我尝试创建一个脚本,计算一个特定的总和(水桥的总和不要紧)。这是我数据文件的一小部分

POP62 SOL11
KAR1  SOL24
KAR5  SOL31
POP17 SOL42
POP15 SOL2
POP17 SOL2
KAR7  SOL42
KAR1  SOL11
KAR6  SOL31

在第一列中,我有 POP 或 KAR 的数字,如 KAR1、POP17 等。在第二列中,我总是有带有数字的 SOL,但我最多有 2 个相同的 SOL(例如,我最多可以有2个SOL42或SOL11等,KAR和POP我可以有2个以上)。

现在是我想做的事情。 如果我发现同一个 SOL 与 both 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 = 
   sub(/[0-9]+$/, "", s)           # strip digits from end in var s
   if ( in map && map[] != s)  # if existing entry is not same 
      ++sum                        # increment sum
   map[] = s
}
END {print sum+0}' file

2

你可以试试这个awk:

awk '
{
   s = 
   sub(/[0-9]+$/, "", s)           # strip digits from end in var s
   if ( in map && map[] != s)  # if existing entry is not same 
      ++sum                        # increment sum
   map[] = s
}
END {print sum+0}' file

2

根据您展示的示例,这是另一种方法。在 GNU awk 中编写和测试,应该在任何 awk.

中工作
awk '
{
  match(,/^[a-zA-Z]+/)
  val=substr(,RSTART,RLENGTH)
  if(( in arr) && arr[]!=val){
    sum++
  }
  arr[]=val
}
END{
  print sum
}
'  Input_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

@anubhava 的类似答案:这对多维数组使用 GNU awk:

gawk '
    {sols[][substr(,0,3)] = 1} 
    END {
        for (sol in sols) 
            if ("POP" in sols[sol] && "KAR" in sols[sol]) 
                sum++
        print sum
    }
' file