Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.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
Bash Awk-计算行之间的相似单词数_Bash_Awk - Fatal编程技术网

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的要求。如果您使用,就不会有这个问题。如果您使用,就不会有这个问题。。