Bash Awk-计算行之间的相似单词数
我有文本操作问题,我自己无法解决,因此我需要更聪明的人的帮助。Bash Awk-计算行之间的相似单词数,bash,awk,Bash,Awk,我有文本操作问题,我自己无法解决,因此我需要更聪明的人的帮助。 我的虚拟文件示例如下所示: Winter Sally Additional_text Winter Sally Additional_text Winter Nicole Additional_text Spring Lucy Additional_text Spring Lucy Additional_text Spring Caroline Additi
我的虚拟文件示例如下所示:
Winter Sally Additional_text
Winter Sally Additional_text
Winter Nicole Additional_text
Spring Lucy Additional_text
Spring Lucy Additional_text
Spring Caroline Additional_text
Spring Caroline Additional_text
Summer Emma Additional_text
Autumn Rita Additional_text
Autumn Rita Additional_text
Autumn Cristina Additional_text
Autumn Lucy's_sister Additional_text
Autumn Lucy's_sister Additional_text
Time Counts
Spring 2
Autumn 2
我想:对于每个第一列项目,计算第二列中有多少不同的名称。但我必须只计算那些名称:1)至少出现两次,2)至少有两个不同的名称(它们都至少出现两次)。
对于这样的输出:
Winter Sally Additional_text
Winter Sally Additional_text
Winter Nicole Additional_text
Spring Lucy Additional_text
Spring Lucy Additional_text
Spring Caroline Additional_text
Spring Caroline Additional_text
Summer Emma Additional_text
Autumn Rita Additional_text
Autumn Rita Additional_text
Autumn Cristina Additional_text
Autumn Lucy's_sister Additional_text
Autumn Lucy's_sister Additional_text
Time Counts
Spring 2
Autumn 2
输出说明:在
Winter
中有两个不同的名字,但Nicole
只出现一次-Winter
未报告在
Spring
中至少有两个不同的名称,每个名称至少出现两次-报告Spring
中有多少个不同的名称在
Summer
中,只有一个名称-Summer
未报告在
秋季
有三个不同的名字,但其中只有两个至少出现过两次——据报道,只有丽塔和露西的妹妹才算
编辑我在awk和bash中的解决方案:
cut -d " " -f 1 FILE | sort -u > names
for i in $(cat names)
do
grep ^$i FILE |
awk '{print $2}' |
sort |
uniq -c |
awk -v VAR="$i" '($1>=2) {print VAR}' |
sort |
uniq -c |
awk '($1>=2) {print $2"\t"$1}'
done
这太笨拙和重复了,所以我想知道更简单的方法。这里有一个awk命令,它应该适合您:
awk '{sums[$1"~"$2]++} END {for (a in sums) {split(a, b, "~"); if (sums[a]>1) suma[b[1]]++;}
for (k in suma) if (suma[k]>1) print k, suma[k]}' inFile
以下是适用于您的awk命令:
awk '{sums[$1"~"$2]++} END {for (a in sums) {split(a, b, "~"); if (sums[a]>1) suma[b[1]]++;}
for (k in suma) if (suma[k]>1) print k, suma[k]}' inFile
我会为你工作的。首先,它统计数组中出现“FIRSTCOL-SECONDCOL
”的次数。然后,在文件末尾,针对每个事件检查事件数,如果事件数大于一,则将FIRSTCOL
存储在另一个数组中(作为键),并将一个添加到其值中。然后打印每个FIRSTVAL
及其值(如果大于1)。我把头球留给你
注意:如果第一列中有任何“-
”将失败
我会为你工作的。首先,它统计数组中出现“FIRSTCOL-SECONDCOL
”的次数。然后,在文件末尾,针对每个事件检查事件数,如果事件数大于一,则将FIRSTCOL
存储在另一个数组中(作为键),并将一个添加到其值中。然后打印每个FIRSTVAL
及其值(如果大于1)。我把头球留给你
注意:如果第一列中有任何“
-
”,它将失败。这里有一种使用GNU awk
的方法。运行方式如下:
awk -f ./script.awk file
script.awk的内容
:
BEGIN {
OFS="\t"
}
{
a[$1][ b[$1,$2]++ ]++
}
END {
print "Time", "Counts";
for (i in a) {
for (j in a[i]) {
if (j >= 1 && a[i][j] >= 2) {
print i, a[i][j]
}
}
}
}
或者,这里有一个班轮:
awk '{ a[$1][ b[$1,$2]++ ]++ } END { print "Time", "Counts"; for (i in a) for (j in a[i]) if (j >= 1 && a[i][j] >= 2) print i, a[i][j] }' OFS="\t" file
结果:
Time Counts
Autumn 2
Spring 2
这里有一种使用
GNU awk
的方法。运行方式如下:
awk -f ./script.awk file
script.awk的内容
:
BEGIN {
OFS="\t"
}
{
a[$1][ b[$1,$2]++ ]++
}
END {
print "Time", "Counts";
for (i in a) {
for (j in a[i]) {
if (j >= 1 && a[i][j] >= 2) {
print i, a[i][j]
}
}
}
}
或者,这里有一个班轮:
awk '{ a[$1][ b[$1,$2]++ ]++ } END { print "Time", "Counts"; for (i in a) for (j in a[i]) if (j >= 1 && a[i][j] >= 2) print i, a[i][j] }' OFS="\t" file
结果:
Time Counts
Autumn 2
Spring 2
你试过什么了?你试过什么了?
(sums[a]>1)
和(suma[k]>1)
是如何工作的?(什么是1
意思?>1
在这两种情况下,都是根据您的要求满足count=2的要求。(sums[a]>1)
和(suma[k]>1)
是如何工作的?(什么是1
意思?>1
在这两种情况下,都是根据您的要求满足count=2的要求。如果您使用,就不会有这个问题。如果您使用,就不会有这个问题。。