【问题标题】:Store Output of Grep In Array将 Grep 的输出存储在数组中
【发布时间】:2016-12-08 00:47:37
【问题描述】:

我在两个目录中有 netCDF 文件,我想最终在其中找到一个变量并进行比较,如果不相等,我想删除这两个文件。到目前为止我所拥有的:

dir1=(/working/test/temp1/*.nc)
dir2=(/working/test/temp2/*.nc)

这里我试图将 grep 的输出存储到一个数组中。我在网站上找到了这些方法,但都不起作用。

for ((i = 0; i < ${#dir1[@]}; ++i)); do
  dir1_arr=($(ncdump -h "$dir1" | grep "Temperature = "))
done

for i in $dir1; do
dir1_arr=($(ncdump -h "$i" | grep "Granules = "))
done

我不确定这是否是正确的方法,但我想比较应该存储在两个单独数组中的颗粒值,如果颗粒不匹配,则删除相应的文件。首先,我需要完成将 grep 的输出存储在数组中的步骤。

【问题讨论】:

  • 当我执行echo ${dir1[@]} 时,屏幕上没有任何内容。
  • 您的 dir1 数组为空。您关心的目录真的是绝对路径/working/... 还是应该只是相对路径working/...
  • @EdMorton 我希望数组包含该目录路径中的 netCDF 文件。应该是相对路径吧。
  • @anubhava 是的,确实显示所有文件的回显
  • echo "${dir1[@]}" 工作吗?

标签: bash for-loop grep


【解决方案1】:

所有呈现的尝试都没有引用$(…),这是必不可少的,因为grep 输出包含多个单词。请参阅此答案的结尾以获取解决方案。另外,还有其他错误:


for ((i = 0; i < ${#dir1[@]}; ++i)); do
  dir1_arr=($(ncdump -h "$dir1" | grep "Temperature = "))
done

这不起作用,因为在循环体中

  • 您使用了$dir1 而不是${dir1[i]}
  • 您使用了dir1_arr= 而不是dir1_arr+=

for i in $dir1; do
dir1_arr=($(ncdump -h "$i" | grep "Granules = "))
done

这不起作用,因为

  • for 命令头中,您使用$dir1 而不是"${dir1[@]}"
  • 在你使用dir1_arr=而不是dir1_arr+=的循环体中

dir1_arr=(); for d in /working/test/temp1/*.nc; do dir1_arr+=($(ncdump -h "$d" | grep "Temperature = ")); done

由于错误的绝对路径/…,这不起作用。


正确的版本是

dir1_arr=()
for d in working/test/temp1/*.nc
do  dir1_arr+=("$(ncdump -h $d | grep 'Granules =')")
done

【讨论】:

    猜你喜欢
    • 2014-09-13
    • 2023-02-13
    • 1970-01-01
    • 2015-03-07
    • 2017-09-20
    • 2021-09-12
    • 2011-11-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多