在linux中如何join2个文件

我有2个文件file_A和file_B。 文件file_A包含文件名,然后在空格之后代码行。 这个代码行可以有任意types的字符说blanks,:等等。它看起来像这样。 请注意,文件中的代码行没有被()包围。 这只是为了说明的目的。

bash $ cat file_A

file_name1 (code line a) file_name1 (code line b) file_name2 (code line c) file_name2 (code line d) file_name2 (code line e) 

文件file_B在file_A中包含file_name和频率

bash $ cat file_B

 file_name1 2 file_name2 3 

我想输出为:(频率,文件名,code_line)

 2 file_name1 (code line a) 2 file_name1 (code line b) 3 file_name2 (code line c) 3 file_name2 (code line d) 3 file_name2 (code line e) 

bash $ join -1 1 -2 1 file_B file_A> file_C

我得到file_C为(我得到连接字段作为第一个字段)

 file_name1 2 (code line a) file_name1 2 (code line b) file_name2 3 (code line c) file_name2 3 (code line d) file_name2 3 (code line e) 

我如何获得第一场的频率场?

我知道,通过连接,我可以使用-o格式并在输出中提及我想要的字段和顺序。 但是我怎么说,把所有的代码行(可以包含任何东西,所以没有这样的分隔符)如此

谢谢,

Solutions Collecting From Web of "在linux中如何join2个文件"

 join file_B file_A | awk '{t=$1; $1=$2; $2=t; print}' > file_C 

注意join不支持在输出格式中指定一个范围的字段,所以下面的内容有点儿怪异,但是在“代码行”中最多支持8个空格,

 join -o 1.2,0,2.2,2.3,2.4,2.5,2.6,2.7,2.8,2.9 file_B file_A 
 sed 's#([^ ]*) ([^ ]*) (.*)#$2 $1 $3#g' 

注:也许你将不得不摆脱正常的括号后面的空格,使其工作。