仅当列 y 是第一个包含 x 的列时,才保留包含 x 的每一行。删除其余包含 x 的行

仅当列 y 是第一个包含 x 的列时,才保留包含 x 的每一行。删除其余包含 x 的行

我正在尝试减少有时包含相同查询的多个结果的结果文件,并且我只想要每个查询的最佳结果。

使用 bash 和 bash 工具(例如 awk、sed 等)。我想要获取 CSV 或 TSV,并且对于每一行,查看 columnY(在本例中为第 4 列)中的 stringX,保留此行并删除所有其他包含值 x 的行,然后再移至下一行。

到目前为止,我有一个 sed 命令,可以删除除第一个 stringX 实例之外的所有内容

sed '1!{/stringX/d}'

我想使用 awk 从 columnY 创建一个 stringX 变量,然后将其传递给 sed 执行其操作(或者是否有其他更有效的方法)。我想尽可能高效地完成这项工作,因此尝试尽可能少地遍历文件会很好。

输入示例:

4.9e-110,360.1,25.4,SL4.0ch08
3.5e-104,357.2,26.6,CM026542.1
1.8e-102,352.6,23.2,SL4.0ch08
4e-100,353.7,21.8,HG975447.1
3e-79,324.2,21.7,CM026542.1
5.1e-86,300.5,21.6,CP047564.1
1.1e-84,296.2,22.2,CP055241.1
1.1e-79,279.6,19.5,HG975447.1
3e-67,238.5,24.8,CP055241.1
1.6e-64,229.4,28.9,CP047564.1
1.6e-62,222.8,25.0,CP047564.1
5.1e-61,217.9,30.5,CM026542.1
etc...

所需输出的示例:

4.9e-110,360.1,25.4,SL4.0ch08
3.5e-104,357.2,26.6,CM026542.1
4e-100,353.7,21.8,HG975447.1
5.1e-86,300.5,21.6,CP047564.1
1.1e-84,296.2,22.2,CP055241.1

到目前为止我的情况如下:

results=$(ls results/*.txt)
for iB in $results
do
        uniqList=$(awk -F, '{print $4}' "$iB" | sort -u)
        for iC in $uniqList
        do
                sed -i '1!{/'"$iC"'/d}' "$iB"
        done
done

这里的想法是,我使用 awk 将第 4 列打印到列表中,对其进行排序并删除任何重复项。然后使用该列表,通过 sed 运行它(我在这里正确使用了单引号和双引号吗?)。不幸的是,这给了我这个结果,它只是文件的顶行:

4.9e-110,360.1,25.4,SL4.0ch08

我做错了什么,但不知所措。任何帮助,不胜感激。

提前致谢。

编辑:所以,我选择了这条路线,它很好,很简单,而且似乎对我有用:

awk -F, '!x[$4]++'

据我所知,这里的 awk 正在检查第 4 列(字段),如果之前没有见过,那么它会打印整行并继续,如果之前见过,它就不会打印它并继续。

答案1

因此,我选择了这条路线,它既简单又好,而且对我来说似乎很有效:

awk -F, '!x[$4]++'

据我所知,这里的 awk 正在检查第 4 列(字段),如果之前没有见过,那么它会打印整行并继续,如果之前见过,它就不会打印它并继续。

相关内容