Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux AWK脚本:查找Col2中每个元素在Col1中的匹配数_Linux_Macos_Awk - Fatal编程技术网

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

Linux AWK脚本:查找Col2中每个元素在Col1中的匹配数,linux,macos,awk,Linux,Macos,Awk,我想用AWK比较一个文件中的两列,有人能提供帮助吗 e、 g 现在,我想使用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]]) 所以

我想用AWK比较一个文件中的两列,有人能提供帮助吗

e、 g

现在,我想使用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]])
所以我想用AWK脚本编写上面的代码,我发现它对我来说太复杂了,因为我还没有使用它


非常感谢您的帮助

没有那么复杂,请将计数保留在按字符索引的数组中,并在最后打印出数组

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)

没有那么复杂,将计数保存在按字符索引的数组中,并在最后打印出数组

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)
替代解决方案

$ 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

替代解决方案中执行所有操作

$ 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

中执行所有操作,所以基本上您只需要计算col2中的每个字母数?还是我完全误解了这个问题?我还要说,,因为太复杂而不努力通常不会让这里的人急于帮助。请删除
python
标记,因为问题不是关于python的,它会吸引那些想要帮助python的人。如果您希望我们帮助您编写awk代码来实现一个算法,那么简单地展示该算法每个人都能理解的伪代码,而不是来自其他语言的代码段。当然,除非您只想从python(或其他什么)专家那里获得awk帮助,否则YMMV会对您最终得到的awk脚本的质量进行测试。我对awk非常在行,我希望我可以在一个小的awk脚本中创建一个等效的python脚本,但我不建议您在一个实时产品中使用它:-)@JoachimIsaksson谢谢,是的,就像你说的,我需要计算Col2中每个字母的数量,例如Col2中有四个D。你能帮我在AWK里做这个吗?很抱歉这么厚,但我在Col1里没有看到任何“A”,只有数字!所以基本上你只需要计算col2中的每个字母?还是我完全误解了这个问题?我还要说,,因为太复杂而不努力通常不会让这里的人急于帮助。请删除
python
标记,因为问题不是关于python的,它会吸引那些想要帮助python的人。如果您希望我们帮助您编写awk代码来实现一个算法,那么简单地展示该算法每个人都能理解的伪代码,而不是来自其他语言的代码段。当然,除非您只想从python(或其他什么)专家那里获得awk帮助,否则YMMV会对您最终得到的awk脚本的质量进行测试。我对awk非常在行,我希望我可以在一个小的awk脚本中创建一个等效的python脚本,但我不建议您在一个实时产品中使用它:-)@JoachimIsaksson谢谢,是的,就像你说的,我需要计算Col2中每个字母的数量,例如Col2中有四个D。你能帮我在AWK里做这个吗?很抱歉这么厚,但我在Col1里没有看到任何“A”,只有数字!只是好奇:为什么重定向而不仅仅是文件名?@tink不是故意的,只是旧习惯。两个都很好:)@JoachimIsaksson谢谢你。我测试过了。一个超过百万行的文件,需要4-5秒:)这就是我喜欢awk的原因。不要使用输入重定向功能,因为它不能扩展到2个或更多的输入文件,而且它会剥夺awk使用
文件名
@EdMorton的能力。我只是一个喜欢使用管道的人,所以根据旧习惯,我倾向于在可能的情况下使用重定向,以便在我改用管道时不会中断:)更新了答案以使用文件名。只是好奇:为什么重定向而不仅仅是文件名?@tink不是故意的,只是旧习惯。两个都很好:)@JoachimIsaksson谢谢你。我测试过了。一个超过百万行的文件,需要4-5秒:)这就是我喜欢awk的原因。不要使用输入重定向功能,因为它不能扩展到2个或更多的输入文件,而且它会剥夺awk使用
文件名
@EdMorton的能力。我只是一个喜欢使用管道的人,所以按照老习惯,我倾向于在可能的情况下使用重定向,以避免在使用管道时出现问题:)更新了答案以使用文件名。我尝试了你的解决方案,它对我也不起作用。它只是将末尾的所有行相加。这就是我从你的帖子中了解到的。第一栏似乎无关紧要。对于
A
s
D
s等的计数,
sort | uniq-c
是标准解决方案,其余只是脚手架。我尝试了你的解决方案,它对我也不起作用。它只是将末尾的所有行相加。这就是我从你的帖子中了解到的。第一栏似乎无关紧要。对于
A
s
D
s等的计数,
sort | uniq-c
是标准解决方案,其余只是脚手架。