如何在bash中将一行文本文件作为不同的变量?

时间:2016-04-15 20:30:48

标签: bash

文本文件仅包含X,Y和Z坐标。

0.29399995009104407 0.5004167755444844 -11.279416799545288

我使用xyz=$( cat porecenter.dat )将文本文件的内容分配给变量xyz。所以$xyz给了我0.29399995009104407 0.5004167755444844 -11.279416799545288,但我需要单独使用它们。我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:4)

无需cat

while read -r x y z
do
    echo "x: $x, y: $y, z: $z"
done < porecenter.dat

如果 porecenter.dat 中只有一行,则不需要while循环。以下是:

read -r x y z < porecenter.dat

答案 1 :(得分:0)

bash中最简单的方法是使用数组:

declare -a arrayxyz
arrayxyz=( $xyz )
printf "x %s  y %s  z %s\n" "${arrayxyz[0]}" "${arrayxyz[1]}" "${arrayxyz[2]}"

请注意添加大括号......

这将依赖默认的IFS(内部字段分隔符)将单词拆分为单独的数组元素,为您提供xyz

将整个文件读入X,Y,Z阵列

您可以使用简短的脚本执行此操作:

#!/bin/bash

fname="${1:-/dev/stdin}"

declare -a arrx  ## declare x, y, z arrays
declare -a arry
declare -a arrz

while read -r x y z; do     ## read file into x, y, z arrays
    arrx+=( $x )
    arry+=( $y )
    arrz+=( $z )
done <"$fname"

## output x, y, z values read
for ((i = 0; i < ${#arrx[@]}; i++)); do
    printf "array[%d] x: %-20s  y: %-20s  z: %-20s\n" \
        "$i" "${arrx[i]}" "${arry[i]}" "${arrz[i]}"
done

示例输入

$ cat dat/xyz.txt
0.29399995009104407 0.5004167755444844 -11.279416799545288
0.29399995009104407 0.5004167755444844 -11.279416799545288
0.29399995009104407 0.5004167755444844 -11.279416799545288

示例输出

$ bash readxyz.sh dat/xyz.txt
array[0] x: 0.29399995009104407   y: 0.5004167755444844    z: -11.279416799545288
array[1] x: 0.29399995009104407   y: 0.5004167755444844    z: -11.279416799545288
array[2] x: 0.29399995009104407   y: 0.5004167755444844    z: -11.279416799545288