gpt4 book ai didi

awk - 处理两个文件时在 AWK 中使用数组

转载 作者:行者123 更新时间:2023-12-01 14:40:51 26 4
gpt4 key购买 nike

我有两个文件,我使用下面的代码基于键合并了它们

file1
-------------------------------
1 a t p bbb
2 b c f aaa
3 d y u bbb
2 b c f aaa
2 u g t ccc
2 b j h ccc

file2
--------------------------------
1 11 bbb
2 22 ccc
3 33 aaa
4 44 aaa

我使用下面的代码合并了这两个基于文件的 key

awk 'NR==FNR{a[$3]=$0;next;}{for(x in a){if(x==$5) print $1,$2,$3,$4,a[x]};  

我的问题是如何将 file2 的 $2 保存在变量或数组中并在 a[x] 之后再次打印。
我想要的结果是:

1 a t p 1   11  bbb  11  
2 b c f 3 33 aaa 33
2 b c f 4 44 aaa 44
3 d y u 1 11 bbb 11
2 b c f 3 33 aaa 33
2 b c f 4 44 aaa 44
2 u g t 2 22 ccc 22
2 b j h 2 22 ccc 22

如您所见,前 7 列是我的合并代码的结果。我需要将最后一列(a[x] 的字段 2)添加到我的结果中。

重要:

我的下一个问题是,如果我有 .awk 文件,我如何使用一些 bash 脚本代码,例如 (| column -t) 或将结果发送到文件 (awk... >结果.txt)?我总是在命令提示符下使用这些代码。我可以在 .awk 文件的代码中使用它们吗?

最佳答案

只需将所有 file2 添加到一个数组中,然后使用 split 来保存您想要的位:

awk 'FNR==NR { two[$0]++; next } { for (i in two) { split(i, one); if (one[3] == $NF) print $1,$2,$3,$4, i, one[2] } }' file2 file1

结果:

1 a t p 1   11   bbb   11
2 b c f 3 33 aaa 33
2 b c f 4 44 aaa 44
3 d y u 1 11 bbb 11
2 b c f 3 33 aaa 33
2 b c f 4 44 aaa 44
2 u g t 2 22 ccc 22
2 b j h 2 22 ccc 22

关于你的最后一个问题;您还可以在 awk 中添加“管道”和“写入”。下面是一个到 column -t 的管道示例:

script.awk 的内容:

FNR==NR { 
two[$0]++
next
}

{
for (i in two) {
split(i, one)
if (one[3] == $NF) {
print $1,$2,$3,$4, i, one[2] | "column -t"
}
}
}

运行方式:awk -f script.awk file2 file1

编辑:

将以下内容添加到您的 shell 脚本中:

results=$(awk '

FNR==NR {
two[$0]++
next
}

{
for (i in two) {
split(i, one)
if (one[3] == $NF) {
print $1,$2,$3,$4, i, one[2] | "column -t"
}
}
}
' $1 $2)

echo "$results"

运行方式:

./script.sh file2.txt file1.txt

结果:

1  a  t  p  1  11  bbb  11
2 b c f 3 33 aaa 33
2 b c f 4 44 aaa 44
3 d y u 1 11 bbb 11
2 b c f 3 33 aaa 33
2 b c f 4 44 aaa 44
2 u g t 2 22 ccc 22
2 b j h 2 22 ccc 22

关于awk - 处理两个文件时在 AWK 中使用数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12904836/

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