如何使用AWK将此类数据排序为数组以在BASH中使用

时间:2015-10-17 05:57:51

标签: bash awk

该文件看起来像这样:

index:index.html
required:file2.1:file2.2

如何将其插入包含字符串的索引数组 - index.html 以及包含字符串的必需数组 - file2.1file2.2。并能够在bash中使用它?

非常感谢您的帮助。

2 个答案:

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