我有一个varsValues.txt文件
cat varsValues.txt
aa=13.7
something=20.6
countries=205
world=1
languages=2014
people=7.2
oceans=3.4
我想创建2个数组,变量和值。它应该包含
echo ${vars[@]}
aa something countries world languages people oceans
echo ${values[@]}
13.7 20.6 205 1 2014 7.2 3.4
我用
Npars=7
readarray -t vars < <(cut -d '=' -f1 varsValues.txt)
readarray -t values < <(cut -d '=' -f2 varsValues.txt)
for (( yy=0; yy<$Npars; yy++ )); do
eval ${vars[$yy]}=${values[$yy]}
done
echo $people
7.2
但我希望它没有readarray,它不适用于Mac(os x)和IFS(interfield separater)。
还有其他解决方案吗? AWK? Perl的?我可以在我的bash脚本中使用它。
感谢。
答案 0 :(得分:4)
您可以使用读取循环。
while IFS=\= read var value; do
vars+=($var)
values+=($value)
done < VarsValues.txt
答案 1 :(得分:3)
这是awk版本。请注意,NPars
不是硬编码的。
vars=($(awk -F= '{print $1}' varsValues.txt))
values=($(awk -F= '{print $2}' varsValues.txt))
Npars=${#vars[@]}
for ((i=0; i<$Npars; i++)); do
eval ${vars[$i]}=${values[$i]}
done
echo $people
答案 2 :(得分:1)
perl -0777 -nE '@F= split /[=\r\n]/; say "@F[grep !($_%2), 0..$#F]"; say "@F[grep $_%2, 0..$#F]"' varsValues.txt
或两次读同一文件,
perl -F'=' -lane 'print $F[0]' varsValues.txt
perl -F'=' -lane 'print $F[1]' varsValues.txt
答案 3 :(得分:1)
您可以使用declare
公告:
declare -a vars=( $(cut -d '=' -f1 varsValues.txt) )
declare -a values=( $(cut -d '=' -f2 varsValues.txt) )
答案 4 :(得分:1)
让我们从这开始:
$ awk -F'=' '{values[$1]=$2} END{print values["people"]}' file
7.2
$ awk -F'=' '{values[$1]=$2} END{for (name in values) print name, values[name]}' file
languages 2014
oceans 3.4
world 1
something 20.6
countries 205
people 7.2
aa 13.7
现在 - 您还需要做什么?
答案 5 :(得分:0)
想通了,我想在这里扔这个:https://raw.githubusercontent.com/AdrianTP/new-environment-setup/master/utils/readarray.sh
# From: https://stackoverflow.com/a/12694189/771948
DIR="${BASH_SOURCE%/*}"
if [[ ! -d "$DIR" ]]; then DIR="$PWD"; fi
. "$DIR/utils/readarray.sh"
我将其保存在我的“ new-environment-setup” Github存储库中的“ utils”文件夹中,当需要将文件读入行数组时,只要将其克隆并导入即可,电脑或擦拭我的驱动器。因此,它应该作为Mac上readarray缺点的补充。
导入看起来像:
readarray "<output_var_name>" "<input_file_name>"
用法看起来像 id1 id2 Page_nbr record_type
St1 Sc1 3 START
Sc1 St1 5 ADD
Sc1 St1 9 OTHER
Sc2 St2 34 START
Sc2 St2 45 DURATION
Sc2 St2 65 END
Sc3 Sc3 4 START
。
是的,这有点粗糙。对于那个很抱歉。它甚至可能无法正常工作,但它确实在某一时刻起作用了,所以我想在这里分享它,以种植简单地...编写自己的回填的想法。
答案 6 :(得分:0)
尝试:
IFS=$'\n' vars=($(cut -d '=' -f1 varsValues.txt))
IFS=$'\n' values=($(cut -d '=' -f2 varsValues.txt))