我的文件格式如下:
在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]
,我已经在中仔细使用了空格答案 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