在 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
我有以下格式的文件:
在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