【问题标题】:Prevent creation of empty files in bash防止在 bash 中创建空文件
【发布时间】:2023-03-06 13:35:01
【问题描述】:

我写了以下代码,其中:

  • $1 = 输入 .csv 文件
  • $2 = 要在 $1 中搜索的字符串列表
  • $3 = 要在 $2 中搜索的不同字符串列表
while read str1
do
    while read str2
    do
     grep $str1 $1 | grep $str2 | cut -d "," -f 6 > ${str1}_${str2}.txt
    done < $3
done < $2

它基本上做了我想做的事情(从不同的输入文件中搜索两个不同的字符串,提取包含两个字符串的行的字段 6 并将字段 6 的内容写入结果文件)。 但是,当然,会为 $2 和 $3 中所有可能的字符串组合创建结果文件,即使它们是空的。有没有办法防止创建一般的空文件,还是我必须在最后删除它们?

【问题讨论】:

  • 在许多方面的改进是将其重写为只处理每个输入文件一次的 Awk 脚本。然后只写你有结果的文件就很容易自然地表达了。
  • 顺便说一句,基本上到处都需要引号。请尝试shellcheck.net 进行详细诊断。
  • 如果给出输入格式的详细信息(即,如果从给定输入匹配的项目都在一个列中)我们目前称之为两个greps 每行结束可以修改为单程 join 管道到循环(在awk,如果我们关心性能),将结果拆分为单独的文件。但细节很重要,这里没有给出充分的说明。

标签: bash grep


【解决方案1】:

您可以使用 $(...) 捕获程序输出:

res=$(grep "$str1" "$1" | grep "$str2" | cut -d "," -f 6)

和 -n 测试,如果一个字符串是空的:

if [[ -n $res ]]; then echo "$res" > "${str1}_${str2}.txt" ; fi

【讨论】:

    猜你喜欢
    • 2021-03-22
    • 2020-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-24
    • 1970-01-01
    • 2016-06-16
    • 1970-01-01
    相关资源
    最近更新 更多