Bash~用for循环修改要打印的内容

时间:2016-10-05 16:17:50

标签: bash for-loop awk printf

好的,我在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循环的每次迭代时延长)

由于

2 个答案:

答案 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

你已经定义了四个变量,也许你根本不需要它们。