我正在尝试使用 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 内的所有行。
这是一个简单的工作脚本(刚刚测试过,没有 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
的文件中或将其更改为上面的脚本。