AWK脚本:查找Col2中每个元素在Col1中具有的匹配数

时间:2016-02-21 20:02:45

标签: linux macos awk

我想使用AWK比较文件中的两列,请有人帮忙吗?

e.g。

Col1   Col2
----   ----
 2      A
 2      D
 3      D
 3      D
 3      A
 7      N
 7      M
 1      D
 1      R

现在我想使用AWK实现以下算法来查找这些列之间的匹配:

list1[] <=== Col1
list2[] <=== Col2
NewList[]
for i in col2:
   d = 0
   for j in range(1,len(col2)):
      if i == list2[j]: 
         d++
   NewList.append(list1[list2.index[i]])

预期结果:

A ==> 2  // means A matches two times to Col1
D ==> 4  // means D matches two times to Col1
....

所以我想用AWK脚本编写上面的代码,我发现它对我来说太复杂了,因为我还没有用过它。

非常感谢您的帮助

2 个答案:

答案 0 :(得分:2)

并非所有这些都复杂,将计数保存在由字符索引的数组中,并在最后打印出数组;

awk '{cnt[$2]++} END {for(c in cnt) print c, cnt[c]}' test.txt

# A 2
# D 4
# M 1
# N 1
# R 1

{cnt[$2]++}  # For each row, get the second column and increase the
             # value of the array at that position (ie cnt['A']++)

END {for(c in cnt) print c, cnt[c]}
             # When all rows done (END), loop through the keys of the
             # array and print key and array[key] (the value)

答案 1 :(得分:1)

替代解决方案

$ rev file | cut -c1 | sort | uniq -c

  2 A
  4 D
  1 M
  1 N
  1 R

格式化管道为... | sed -r 's/(\w) (\w)/\2 ==> \1/'

  A ==> 2
  D ==> 4
  M ==> 1
  N ==> 1
  R ==> 1

或者,在awk

中执行所有操作