好的,我在bash脚本中有这一行,如下所示:
basic_list=$(awk '{printf "%s/%s/%s/%s\n", $1, $2, $3, $4}' <<< "${STANDARD_LIST}")
如图所示,将STANDARD_LIST每行的第1,第2,第3和第4个字打印到变量basic_list(再次使用行分割)
现在我的问题是我也有这些命令:
basic_list2=$(awk '{printf "%s/%s/%s\n", $1, $2, $3}' <<< "${STANDARD_LIST}")
basic_list3=$(awk '{printf "%s/%s\n", $1, $2}' <<< "${STANDARD_LIST}")
basic_list4=$(awk '{printf "%s\n", $1}' <<< "${STANDARD_LIST}")
有没有办法在bash中使用for循环将所有这些行压缩成一个? (即修改printf的字符串,以便在for循环的每次迭代时延长)
由于
答案 0 :(得分:1)
如果您需要设置bash
个变量,请不要使用awk
。直接在bash
中工作,例如
declare -a tmp tmp2 tmp3 tmp4
while read -a f; do
printf -v str '%s/%s/%s/%s' "${f[@]:0:4}"
tmp+=$str
tmp2+=${str%/*}
tmp3+=${str%/*/*}
tmp4+=${str%/*/*/*}
done <<< "$STANDARD_LIST"
basic_list=$(printf '%s\n' "${tmp[@]}")
basic_list2=$(printf '%s\n' "${tmp2[@]}")
basic_list3=$(printf '%s\n' "${tmp3[@]}")
basic_list4=$(printf '%s\n' "${tmp4[@]}")
答案 1 :(得分:1)
我不确定你想要实现什么,但是一旦你有了bash数组,就可以对其进行切片,例如
$ source=( a b c d e f )
$ echo "${source[@]}"
a b c d e f
$ echo "${source[@]:0:4}"
a b c d
$ echo "${source[@]:0:3}"
a b c
$ echo "${source[@]:0:2}"
a b
$ echo "${source[@]:0:1}"
a
你已经定义了四个变量,也许你根本不需要它们。