我的情況與這個類似,對我的情況實施這種解決方案有困難。
我有file.tsv的格式如下:
x y
狗汪汪
CAT meow
響亮的鵝叫聲-honk
鴨子呱呱叫
有固定數量的列(但行數可變),我需要在一個像下面這樣的腳本(偽代碼)中回圈這些值對,除了第一個值之外,其余的都要回圈
。for elements in list; do
./script1元素[1] 元素[2)
./script2 元素[1] 元素[2)
done
這樣,script*就可以從這對引數中獲取引數并運行。
是否有辦法在Bash中做到這一點?
我在想我可以這樣做:
list1={`awk 'NR > 1{print $1}' file.tsv`}。
list2={`awk 'NR > 1{print $2}' file.tsv`}。
然后根據它們的位置在回圈中呼叫它們,但我不確定如何呼叫。
謝謝!
uj5u.com熱心網友回復:
Shell表不是多維的,所以表元素不能為你的腳本存盤兩個引數。然而,由于你正在處理來自file.tsv的行,你可以在每一行上迭代,像這樣一次讀取兩個元素:
#!/usr/bin/env sh
# 用標簽字符填充標簽。
tab="$(printf ' ' )"
# 由于printf的子殼添加了一個尾部的換行,所以將其洗掉。
tab="${tab%?}"
{
# 讀取虛擬變數_中的第一行以跳過標題。
讀 -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"/span> "$y"/span>
完成了。
} < file.tsv # from this file
uj5u.com熱心網友回復:
你可以嘗試只用while read回圈,使用-a標志和IFS。
#!/usr/bin/env bash
while IFS=$' '/span> read -ra line; do
echo ./script1 "${line[0]}"/span> "${line[1]}"
echo ./script2 "${line[0]}"/span> "${line[1]}"
done < < (tail -n 2 file.tsv)
或者沒有tail
#!/usr/bin/env bash
skip=0 start=-1
while IFS=$' '/span> read -ra line; do
if ((start >= skip)); then
echo ./script1 "${line[0]}"/span> "${line[1]}"/span>
echo ./script2 "${line[0]}"/span> "${line[1]}"
fi
done < file.tsv
- 如果你對輸出結果滿意的話,就去掉
echo的內容。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/308003.html
標籤:
