我有两个文件,如下:
文件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/