arrays - 在 AWK 中使用 Bash 数组

标签 arrays linux bash awk

我有两个文件,如下:

文件1:

3 1
2 4
2 1

文件2:

23
9
7
45

file1 的第二个字段用于指定 file2 中包含要检索和打印的数字的行。在所需的输出中,打印 file1 的第一个字段,然后打印检索到的字段。

所需的输出文件:

3 23
2 45
2 23

这是我解决这个问题的尝试:

IFS=$'\r\n' baf2=($(cat file2));echo;awk -v av="${baf2[*]}"  'BEGIN {split(av, aaf2, / /)}{print $1, aaf2[$2]}' file1;echo;echo ${baf2[*]}

但是,此脚本无法使用 Bash 数组 baf2

该解决方案必须高效,因为在实际情况中,file1 有数十亿行,而 file2 有数百万行。

最佳答案

这与 Jotne 的解决方案有类似的基础,但首先将 file2 加载到内存中(因为它比 file1 小):

awk 'FNR==NR{x[FNR]=$0;next}{print $1 FS x[$2]}' file2 file1

说明

FNR==NR 部分表示大括号后面的部分仅在读取 file2 时执行,而不是在读取 file1 时执行。读取 file2 的每一行时,它都会保存在由当前行号索引的数组 x[] 中。第二组花括号中的部分针对 file1 的每一行执行,并打印该行上的第一个字段,后跟字段分隔符(空格),后跟 x[] 中的条目(由该行上的第二个字段索引) .

关于arrays - 在 AWK 中使用 Bash 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21874499/

相关文章:

c - 指向字符串的指针数组

c++ - 不使用 new 的动态二维数组

java - 检查 objekt 是否是数组

c++ - 在 Linux 中正确部署 Qt 应用程序

java - bash 与 java 的子进程对话?

java - 哪个更快 - 在数组或链表的末尾插入元素

python - 终端关闭时终止sudo python脚本

c++ - C/C++ FastCGI Developers 工具包示例程序(不工作?)

linux - 如何在bash中提取子字符串

python - 如何用 bash 脚本杀死 python 脚本