【问题标题】:How to include grep searches that return blank values in my output?如何在我的输出中包含返回空白值的 grep 搜索?
【发布时间】:2021-02-10 07:29:01
【问题描述】:

我有一个类似这样的制表符分隔文件,其中包含大约 120 000 个名为 no-dots.txt 的条目:

cluster0   E:1.2e-12^RecName: Full=Putative tyrosine phosphatase 123R;^Viruses
cluster1   E:1.2e-12^RecName: Full=Putative tyrosine phosphatase 123R;^Viruses
cluster2   E:1.2e-12^RecName: Full=Putative tyrosine phosphatase 123R;^Viruses

到目前为止,我有以下脚本:

readarray -t clusternames_array < clusternames.txt

for name in "${clusternames_array[@]}"
do
    grep -w $name **no-dots.txt** | awk -F "\t" '{print $2}' | awk -F '=' '{print $2}' | awk -F ";" '{print $1}' | sed s/{[^{}]*}//g | sort | uniq -c | sort -k 1,1nr | head -n 1 | cut -b 5-8
done

我正在对文件中的每个集群(cluster0、cluster1、cluster2、... cluster120000)进行 grep-ping 操作,并尝试在第二列中提取信息。

接下来的三个awk步骤,和sed步骤只是为了减少

E:1.2e-12^RecName: Full=Putative tyrosine phosphatase 123R;^Viruses

类似于

Putative tyrosine phosphatase 123R

这一步对我来说很好。

sort | uniq -c | sort只是统计每个簇中唯一名称的个数,从升序到降序排序。

head -n 1 让我继续使用出现次数最多的名称。

这个输出通常类似于

     7    Putative tyrosine phosphatase 123R

由于这种格式,我只是使用

cut -b 5-8 提取出现次数 cut -b 5-8 --complement 提取最常出现的条目的名称

我在 for 循环中运行它,以便获得一个包含 120 000 个数字/名称的列表,我可以简单地将其粘贴到 Excel 文件中。最终,即使 grep 没有找到任何内容,我也希望为 EVERY 集群创建一个条目。但是,如果此代码的输出什么都没有(据我所知是一个空字符串),则它不会写入生成的列表中。我最终得到的文件总是要短得多。

如何更改我的脚本以包含没有值的行,以便最终得到一个包含 120 000 个条目的输出文件?

作为一个例子,我得到一个这样的文件:

name0
name1
name3
name4
name6
name7
name9

其中 name2、name5、name8 等被省略,但我想添加任何占位符来保持每个输出的位置:

name0
name1
NULL
name3
name4
NULL
name6
name7
NULL
name9

【问题讨论】:

标签: bash awk is-empty


【解决方案1】:

这样的……

$ awk -F'\t|=|;' '{print $1,$3}' no-dots.txt |
  sort | uniq -c | sort -k2 -k1,1nr          | 
  awk '!a[$2]++ {print $2,$3}'               | 
  awk 'NR==FNR{a[$1]=$2; next} {print $1 in a?a[$1]:"NULL"}' - clusternames.txt

很遗憾,您没有可测试的输入数据,因此未进行测试。

【讨论】:

    【解决方案2】:

    将此附加到您的 loooong 命令链:

    | grep . || echo NULL
    

    解释:

    • command1 || command2 构造仅在 command1 失败时执行 command2,即它返回的不是 0。

    • 默认情况下,管道(=command1 | command2 | ... | commandN)的退出状态(返回给shell的值)是最后一个命令的退出状态。

    • 如果你的最后一个命令(这里是cut -b 5-8)没有输出任何东西,那么我们刚刚添加的grep .将会失败并返回1(失败)。因此,shell 将认为整个管道命令链已失败,并且由于 || 运算符,shell 将执行命令 echo NULL

    • 如果你的最后一个命令 (cut -b 5-8) 输出任何内容,那么输出将保持不变:grep . 将充当无操作并返回 0(成功),因为它找到了一些东西.因此,shell 将认为整个管道命令链已成功,并且由于 || 运算符,echo NULL 将不会被执行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-03
      • 2017-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多