【问题标题】:Loop through table and parse multiple arguments to scripts in Bash循环遍历表并将多个参数解析到 Bash 中的脚本
【发布时间】:2021-11-11 10:09:06
【问题描述】:

我的情况与this one 类似,并且难以针对我的情况实施这种解决方案。

我的file.tsv 格式如下:

x     y
dog     woof
CAT     meow
loud_goose     honk-honk
duck     quack

具有固定数量的列(但可变行),我需要在如下脚本中循环这些值对,除了第一个值(伪代码)

for elements in list; do
    ./script1 elements[1] elements[2]
    ./script2 elements[1] elements[2]
done

这样script* 可以从该对中获取参数并使用它运行。

有没有办法在 Bash 中做到这一点?

我在想我可以做这样的事情:

list1={`awk 'NR > 1{print $1}' file.tsv`}
list2={`awk 'NR > 1{print $2}' file.tsv`}

然后根据他们的位置在循环中调用他们,但我不确定如何。

谢谢!

【问题讨论】:

    标签: bash loops csv arguments


    【解决方案1】:

    Shell 表不是多维的,因此表元素不能为您的脚本存储两个参数。但是,由于您正在处理来自 file.tsv 的行,因此您可以在每一行上进行迭代,同时读取两个元素,如下所示:

    #!/usr/bin/env sh
    
    # Populate tab with a tab character
    tab="$(printf '\t')"
    
    # Since printf's sub-shell added a trailing newline, remove it
    tab="${tab%?}"
    
    {
      # Read first line in dummy variable _ to skip header
      read -r _
    
      # Iterate reading tab delimited x and y from each line
      while IFS="$tab" read -r x y || [ -n "$x" ]; do
        ./script1 "$x" "$y"
        ./script2 "$x" "$y"
      done
    } < file.tsv # from this file
    

    【讨论】:

    • 我认为应该可以,谢谢,我现在测试一下。你介意我问|| [ -n "$x" ] 在这种情况下做了什么吗?
    • 如果文件的最后一行没有以换行符结尾,read 命令将在读取 x 和 y 字段时返回失败。 || [ -n "$x" ] 测试变量 x 不为空(已被读取)。 → 成功读取 x y 或检查 x 不为空
    【解决方案2】:

    您可以尝试使用 -a 标志和 IFS 的 while + read 循环。

    #!/usr/bin/env bash
    
    while IFS=$' \t' read -ra line; do
      echo ./script1 "${line[0]}" "${line[1]}"
      echo ./script2 "${line[0]}" "${line[1]}"
    done < <(tail -n +2 file.tsv)
    

    或者没有tail

    #!/usr/bin/env bash
    
    skip=0 start=-1
    
    while IFS=$' \t' read -ra line; do
      if ((start++ >= skip)); then
        echo ./script1 "${line[0]}" "${line[1]}"
        echo ./script2 "${line[0]}" "${line[1]}"
      fi
    done < file.tsv
    

    • 如果您对输出感到满意,请删除 echo

    【讨论】:

      猜你喜欢
      • 2016-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多