[英]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中,或者Y
或Z
从关联数组中提取值。
该声明应超出循环范围。 变量插值需要在前面加一个美元符号。 剩下的只是重构。
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}/,"","")
),并将结果存储在由原始第二个字段索引的关联数组a
( a[$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.