繁体   English   中英

bash中的关联数组以X开头存储所有行

[英]Associative array in bash to store all lines start with X

我有一个包含行的文件,我将按$ 1输入:

X B C D E
X G H I J
X L M N 
Y G  
Z B
Y L

在以X开头的每一行中,键是第二个元素,值是其余元素。

我正在逐行读取文件,并为每个文件创建关联数组。

while read LINE
do
 INPUT=$(echo $LINE |awk '{print $1}')
 if [[ "$INPUT" = X ]]
 then
     key_name=$(echo $LINE | awk '{print $2}')
     declare -A dependencies 
     value_names=($(echo $LINE|awk '{$1=$2=""; print $0}'))
     dependencies[key_name]=value_names
     echo -e "\nvalues of $key_name are ${key_name[*]}\n"
     sleep 1
 fi
done < $1

因此,我失去了每一行读数的价值。

但是我需要将所有带有X的行存储在关联行中,因为稍后需要为以后的行搜索关键字,可以说:以Y开头的行,它有G ,所以在这里我需要找到键G关联数组中的值。

谁能提出一些想法,如何通过读取文件的行来将所有以X开头的行存储在单个关联数组中? 还是更好的方法?

在给出的样本输入中,输出将分为3行:

H I J
C D E
M N

X,Y,X在这里识别行,如何处理下一个字符。 如果X将其余部分存储在KEY-PAIR中,或者YZ从关联数组中提取值。

该声明应超出循环范围。 变量插值需要在前面加一个美元符号。 剩下的只是重构。

declare -A dependencies
awk '$1=="X"{$1=""; print }' "$1" |
{ while read -r key value; 
  do
    dependencies["$key"]="$value"
    echo -e "\nvalues of $key_name are ${key_name[*]}\n"
    #sleep 1
  done
  :
  # do stuff with "${dependencies[@]}"
}

对gensub()使用GNU awk:

$ gawk '{ if (/^X/) a[$2] = gensub(/(\S+\s+){2}/,"",""); else print a[$2] }' file
H I J
C D E
M N

上面的内容隐式地循环遍历输入文件中的每一行,当它找到以X( /^X/ )开头的行时,它将删除前2个非空格-然后-空格对( gensub(/(\\S+\\s+){2}/,"","") ),并将结果存储在由原始第二个字段索引的关联数组aa[$2] = ... ),因此对于输入行XBCDE它保存a["B"] = "CDE" 如果该行不是以X( else )开头,则它将打印当前行中第二个字段索引的数组,因此对于输入行ZB ,它将执行print a["B"]并输出CDE

使用旧版本的gawk(运行gawk --version并检查4.0之前的版本),您可能需要:

$ gawk --re-interval '{ if (/^X/) a[$2] = gensub(/([^[:space:]]+[[:space:]]+){2}/,"",""); else print a[$2] }' file

但是,如果您错过了许多非常有用的功能,那么请购买新的产品!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM