遍历 table 并解析 Bash 中脚本的多个参数

Loop through table and parse multiple arguments to scripts in Bash

我的处境与 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 }' file.tsv`}
list2={`awk 'NR > 1{print }' file.tsv`}

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

谢谢!

Shell table 不是多维的,因此 table 元素不能为您的脚本存储两个参数。然而,由于您正在处理来自 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

您可以尝试使用 -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