在awk中以特定方式计数

在awk中以特定方式计数,awk,text-processing,Awk,Text Processing,我有个问题。这是我输入文件的一小部分 SOL168 MGD750 SOL259 MGD11 SOL363 MGD38 SOL168 MGD142 SOL363 MGD784 SOL660 MGD752 SOL440 MGD38 SOL440 MGD38 我需要计算具体的重复次数。如果在两个不同行的第一列中有相同的SOL,在第二列中有一行MGD1-225,则必须在另一行MGD 676-900中进行计数 比如说 SOL115 MGD201 SOL115 MGD782 这个算一个 另一个例子 SO

我有个问题。这是我输入文件的一小部分

SOL168 MGD750
SOL259 MGD11
SOL363 MGD38
SOL168 MGD142
SOL363 MGD784
SOL660 MGD752
SOL440 MGD38
SOL440 MGD38
我需要计算具体的重复次数。如果在两个不同行的第一列中有相同的SOL,在第二列中有一行MGD1-225,则必须在另一行MGD 676-900中进行计数 比如说

SOL115 MGD201
SOL115 MGD782
这个算一个 另一个例子

SOL749 MGD751
SOL749 MGD111
在我的输入文件中,我将期望输出

2
因为SOL363与MGD38(第一层)和MGD784(第二层)有键-第一个垂直水桥

SOL168与MGD750(第二层)和MGD142(第一层)有键

现在我的整个剧本都成功了

#!/bin/bash
for index in {1..100} # I do this script on 100 files, that is s why I use for loop
do
awk '
    BEGIN { FS = "MGD" }
    $2 >= 1 && $2 <= 225 { layer1[$1]++ }
    $2 >= 676 && $2 <= 900 { layer2[$1]++ }
    END {
        for (sql in layer1) {
        if (layer1[sql] == 1 && layer2[sql] == 1)
            ++total
    }
    print total
    }
' eq5_15_333_lipid_sol_fragment_$index.ndx >> vertical_water_bridges.txt 
done
#/bin/bash
对于{1..100}中的索引,我在100个文件上执行此脚本,这就是我使用for循环的原因
做
awk'
开始{FS=“MGD”}

$2>=1&&$2=676&&$2使用
MGD
作为字段分隔符,
$2
成为数字层指示器,awk可以非常直接地表达您的问题陈述:

BEGIN { FS = "MGD" }
$2 >= 1 && $2 <= 225 { layer1[$1]++ }
$2 >= 676 && $2 <= 900 { layer2[$1]++ }
END {
    total = 0
    for (sql in layer1) {
        if (sql in layer2)
            ++total
    }
    print total
}


$ awk -f a.awk file
2
BEGIN{FS=“MGD”}

$2>=1&&$2=676&&$2您为此尝试过任何awk命令吗?删除所有特定于域的语言,并从输入中的字符串和输出中的字符串以及如何将一个字符串转换为另一个字符串来描述您的问题。@EdMorton我现在编辑的可以了吗?这稍微好一点,但您仍然可以从您所属的任何域来解释问题例如,由于SOL363与MGD38(从第一层)和MGD784(从第二层)有键,因此在
中工作-第一垂直水桥SOL168与MGD750(第二层)和MGD142(第一层)有键。
。这无助于以我们大多数人都能理解的方式解释您的需求。您还可以显示不包含MGD1-225或SOL115的输入块,然后讨论/显示您希望从中获得的输出。只需发布简明的示例输入和您期望从该输入中获得的输出。