遍历 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
。
我的处境与 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
。