该文件看起来像这样:
index:index.html
required:file2.1:file2.2
如何将其插入包含字符串的索引数组 - index.html
以及包含字符串的必需数组 - file2.1
和file2.2
。并能够在bash中使用它?
非常感谢您的帮助。
答案 0 :(得分:1)
正如John1024指出的那样,因为你最后想要bash数组,你可以使用bash完成整个工作,而你不需要awk。所以,如果它是你的家庭作业的一部分,要么向老师解释你找到更好的方法,要么使用一些不那么优雅和高效的东西:
filename=<name-of-input-file>
a=($(awk -F: '$1 == "required" {for(i=2;i<=NF;i+=1) printf $i" "}' $filename))
echo ${a[0]}
file2.1
echo ${a[1]}
file2.2
<强>解释强>
a=(word1 word2 ...)
使用列出的字词指定bash数组a
。
$(command)
评估bash命令。
awk -F: '$1 == "required" {for(i=2;i<=NF;i+=1) printf $i" "}' data.txt
使用awk过滤文件data.txt
,使用:
作为字段分隔符。如果第一个字段是required
,则打印所有其他字段(NF
是字段数),用空格分隔。
当然,您可以非常轻松地调整它以创建其他bash数组。我把它留给你作为一种验证你做得好的方法。
答案 1 :(得分:0)
如果要创建bash数组,则需要使用bash,而不是awk:
declare -A req
declare -A arr
while IFS=: read a b c
do
if [ "$a" = "required" ]
then
req[$b]=$c
elif [ "$b" ]
then
arr[$a]=$b
fi
done <file
使用您的示例输入,这将创建您要求的两个阵列:
declare -A arr='([index]="index.html" )'
declare -A req='([file2.1]="file2.2" )'
必须在使用前声明关联数组:
declare -A req
declare -A arr
以下开始循环。它从输入中读取前三个冒号分隔的字段:
while IFS=: read a b c
do
如果第一个字段是required
,那么这将使用第二个和第三个字段在数组req
中创建一个新条目:
if [ "$a" = "required" ]
then
req[$b]=$c
否则,假设存在非空的第二个字段,则会向数组arr
添加一个条目:
elif [ "$b" ]
then
arr[$a]=$b
fi
下面的代码标志着循环的结束并指示应该从文件file
获取循环输入:
done <file