gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:58:08 24 4
gpt4 key购买 nike

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

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

每行以X开头,键是第2个元素,值是其余元素。

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

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

所以我失去了每一行阅读的值(value)。

但我需要将所有带有 X 的行存储在关联数组中,因为我需要稍后为后面的行搜索键,假设:一行以 Y 开头,并且它有 G,所以在这里我需要从关联的数组中找到值用 G 键。

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

根据给定的示例输入,输出将分为 3 行:

H I J
C D E
M N

这里X,Y,X是识别台词,接下来的字符怎么办。如果 X 将其余部分存储在 KEY-PAIR 中,或者如果 YZ 从关联数组中提取值。

最佳答案

将 GNU awk 用于 gensub():

$ 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] = ...),因此例如对于输入行 X B C D E 它保存 a["B"] = "C D E"。如果该行不是以 X (else) 开头,那么它将打印由当前行中的第二个字段索引的数组,因此对于输入行 Z B 它将执行 打印 a["B"] 并输出 C D E

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

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

但如果是这样的话,你会错过很多非常有用的功能,所以换个新的 gawk!

关于arrays - bash 中的关联数组用于存储所有以 X 开头的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25960265/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com