Linux AWK脚本:查找Col2中每个元素在Col1中的匹配数
我想用AWK比较一个文件中的两列,有人能提供帮助吗 e、 g 现在,我想使用AWK实现以下算法来查找这些列之间的匹配: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]]) 所以
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
sD
s等的计数,sort | uniq-c
是标准解决方案,其余只是脚手架。我尝试了你的解决方案,它对我也不起作用。它只是将末尾的所有行相加。这就是我从你的帖子中了解到的。第一栏似乎无关紧要。对于A
sD
s等的计数,sort | uniq-c
是标准解决方案,其余只是脚手架。