bash:在两个文件之间进行比较以追加列

时间:2016-07-07 22:29:12

标签: linux bash shell posix

我有两个文件。 第一个文件是这样的:

name_service1|||S_SUCCESS||1111111111
name_service1|||S_SUCCESS||1111111112
name_service1|||S_SUCCESS||1111111113
name_service1|||S_SUCCESS||1111111114
name_service1|||S_SUCCESS||1111111115
name_service1|||S_SUCCESS||1111111116
name_service1|||S_SUCCESS||1111111117
name_service1|||S_SUCCESS||1111111118

第二个文件是这样的:

name_service1,20160705,0900
name_service2,20160705,0800

我需要通过 name_service 字段对两个文件进行比较,并且当字段相同时添加日期和小时;类似的东西:

name_service1|20160705|0900|S_SUCCESS||1111111111
name_service1|20160705|0900|S_SUCCESS||1111111112
name_service1|20160705|0900|S_SUCCESS||1111111113
name_service1|20160705|0900|S_SUCCESS||1111111114
name_service1|20160705|0900|S_SUCCESS||1111111115
name_service1|20160705|0900|S_SUCCESS||1111111116
name_service1|20160705|0900|S_SUCCESS||1111111117
name_service1|20160705|0900|S_SUCCESS||1111111118

第一个文件很大,因此使用while read行并为第一个文件的每一行执行grep需要很长时间。第二个文件只有5行或6行。

还有其他办法吗?

此致

1 个答案:

答案 0 :(得分:3)

使用bashjointrsed

join -t '|' -j 1 -o 1.1,2.2,2.3,1.4,1.5,1.6,1.7 -a 1 file1 <(tr ',' '|' < file2) | \
sed 's/|$//'

相同,但没有 bash isms:

tr ',' '|' < file2 | \
join -t '|' -j 1 -o 1.1,2.2,2.3,1.4,1.5,1.6,1.7 -a 1 file1 - | \
sed 's/|$//'