如何使用 Bash 命令提取多行集群?

问题描述 投票:0回答:1

我正在尝试使用 Bash 命令从文本文件中提取簇。每个簇都由一条以 >Cluster 开头的线来划分。我只想提取其中包含多个数据行的那些簇。这是我的输入文件的简化示例:

>Cluster 199
0       2599aa, >CAD5117741.1... *
>Cluster 200
0       2579aa, >CAD5112262.1... *
>Cluster 201
0       2578aa, >CAD5116287.1... *
>Cluster 202
0       2578aa, >CAD5122864.1... *
1       1867aa, >CAD5122865.1... at 100.00%
2       2369aa, >CAD5122866.1... at 100.00%
>Cluster 203
0       2573aa, >CAD5110750.1... *
>Cluster 204
0       2571aa, >CAD5116249.1... *
>Cluster 205
0       2558aa, >CAD5122682.1... *
>Cluster 206
0       2553aa, >CAD5126525.1... *
>Cluster 207
0       2551aa, >CAD5115834.1... *

在此示例中,我只想提取集群 202,因为它包含不止一行数据。所需的输出将是:

>Cluster 202
0       2578aa, >CAD5122864.1... *
1       1867aa, >CAD5122865.1... at 100.00%
2       2369aa, >CAD5122866.1... at 100.00%

我目前正在使用 awk 来处理文件,但正在努力弄清楚如何正确提取这些簇。有人可以指导我使用 Bash 命令有效地完成这项任务吗?

我尝试使用以下 awk 命令:

awk '/^>Cluster/ {cluster=$0; count=0; next} {count++} count > 1 {print cluster; print} count == 0 {print cluster}'

当应用于提供的数据时,它产生以下输出:

>Cluster 202 2 2369aa, >CAD5122866.1... at 100.00%

此输出不完整,因为它应包括 Cluster 202 内的所有行。

bash awk sed grep
1个回答
0
投票

这是一个简单的工作脚本(刚刚测试过,没有 awk):

#!/bin/bash

current_cluster=""
data_rows=0

while read -r line; do
    if [[ $line == ">Cluster "* ]]; then
        if [[ $data_rows -gt 1 ]]; then
            echo -e "$current_cluster" 
        fi
        
        current_cluster="$line"  
        data_rows=0
    else
        ((data_rows++))
        current_cluster="$current_cluster\n$line" 
    fi
done < clusters.txt

if [[ $data_rows -gt 1 ]]; then
    echo -e "$current_cluster"
fi

记住将输入数据保存到名为

clusters.txt
的文件中或将其更改为上面的脚本。

© www.soinside.com 2019 - 2024. All rights reserved.