在Bash中迭代连接多个文件

在Bash中迭代连接多个文件,bash,data-cleaning,Bash,Data Cleaning,我有以下格式的文件: 在file0.txt中 234 ABC 123 KJN 245 MDJ 274 FWX 在file1.txt中 45 ABC 1 KJN 546 MDJ 456 FWX 同样,我总共有24个文件,从file0.txt到file23.txt 我正试图根据第2列作为键将所有这些文件合并到一个文件中。 期望输出为: ABC 234 45 KJN 123 1 MDJ 245 546 FWX 274 456 我写了这样的东西: for(i=0;i<=23;i++) do

我有以下格式的文件:

在file0.txt中

234 ABC
123 KJN
245 MDJ
274 FWX
在file1.txt中

45 ABC
1 KJN
546 MDJ
456 FWX
同样,我总共有24个文件,从file0.txt到file23.txt 我正试图根据第2列作为键将所有这些文件合并到一个文件中。 期望输出为:

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
for(i=0;i fileJoined.txt)
fileJoined.txt>文件`expr$i+1`.txt
fi
完成
逻辑在第一次运行后失败,因为连接的文件结构已更改,并且连接尝试在第二列连接它。请建议如何更正此问题。还有更好的方法吗?请注意,如果[-e file$I]

使用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

感谢您的回复,但是我有24个这样的文件,如file0.txt和file1.txt中所示。我能用awk以所需的格式最终得到一个完整的文件吗?只需将所有需要的文件添加到脚本的末尾,或者使用通配符并将输出重定向到一个新文件,如
awk'…'文件*>newfile
Ok,这样就可以了,但唯一的问题是键后显示的第一条记录本质上是最后一条记录。因此,例如,如果我得到:ABC 234 45 2343 12,实际顺序应该是:ABC 45 2343 12 234脚本将值(
$1
)按其获得的顺序追加(
a[$2]=a[$2]of s$1
)。您可以通过按所需顺序处理文件来更改顺序(
awk'…'file3 file1 file2..
)。非常感谢,这很有帮助