在 Bash 中迭代加入多个文件

Joining multiple files iteratively in Bash

我有以下格式的文件:

在file0.txt

234 ABC
123 KJN
245 MDJ
274 FWX

在file1.txt

45 ABC
1 KJN
546 MDJ
456 FWX

同样,我从file0.txt到file23.txt总共有24个文件 我正在尝试将所有这些文件加入到一个基于第二列作为键的文件中。 期望的输出是:

ABC 234 45
KJN 123 1
MDJ 245 546
FWX 274 456

我写了这样的东西:

for(i=0;i<=23;i++)
 do
     if[ -e file$i ]
       then
             join -1 2 -2 2 file$i.txt file`expr $i +1`.txt > fileJoined.txt
             fileJoined.txt > file`expr $i +1`.txt
     fi
 done

逻辑在第一个 运行 后失败,因为连接的文件结构已更改并且连接尝试在第二列上连接它。请建议如何更正此问题。还有没有更好的方法来实现这一目标?请注意,我在 if [ -e file$i ]

中小心地使用了 space

使用 awk:

$ awk '{a[]=a[] (a[]==""?"":OFS) }END{for(i in a)print i,a[i]}' file1 file2

输出:

ABC 234 45
FWX 274 456
MDJ 245 546
KJN 123 1

脚本将记录存储到内存中,因此您应该有足够的内存来处理所有需要的文件。解释:

$ awk '{
    a[]=a[] (a[]==""?"":OFS)   # hash all records to a, index with 
}
END {                                  # after hashing all records
    for(i in a)                        # go thru all of them in random order
        print i,a[i]                   # and output them
}' file1 file2