在Bash中迭代连接多个文件

时间:2018-09-19 09:11:35

标签: bash data-cleaning data-cleansing

我的文件格式如下:

在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

第一次运行后,逻辑将失败,因为更改了联接的文件结构,并且联接尝试在第二列上将其联接。请提出解决方法。还有没有更好的方法来实现这一目标?请注意,如果[-e file $ i]

,我已经在中仔细使用了空格

1 个答案:

答案 0 :(得分:1)

使用awk:

$ awk '{a[$2]=a[$2] (a[$2]==""?"":OFS) $1}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[$2]=a[$2] (a[$2]==""?"":OFS) $1  # hash all records to a, index with $2
}
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