【问题标题】:Count in specific way in awk在 awk 中以特定方式计数
【发布时间】:2021-01-01 06:45:33
【问题描述】:

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

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

【问题讨论】:

  • 你有没有为此尝试过任何 awk 命令?
  • 删除所有特定领域的语言,并根据输入中的字符串和输出中的字符串以及如何将一种转换为另一种来描述您的问题。
  • @EdMorton 我现在编辑可以吗?
  • 它好一点,但你仍然可以根据你工作的任何领域来解释事情,例如。 because SOL363 have bonds with MGD38(from the first layer) and also MGD784 (from the second layer) - first vertical water bridge SOL168 have bonds with MGD750 (second layer) and MGD142(first layer)。这无助于以我们大多数人都能理解的方式解释您的要求。您还显示了一个不包含 MGD1-225 或 SOL115 的输入块,然后讨论/显示您想要的输出。只需发布简洁的示例输入和您期望来自该输入的输出。

标签: awk text-processing


【解决方案1】:

使用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

【讨论】:

    猜你喜欢
    • 2020-12-28
    • 1970-01-01
    • 2014-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多