在linux中如何加入2个文件

时间:2010-12-07 16:57:58

标签: linux shell join sed awk

我有2个文件file_A和file_B。文件file_A包含文件名,然后在空格后包含代码行。 此代码行可以有随机类型的字符说空白,等等。它看起来像这样。请注意,文件中的代码行未被()包围。这仅用于说明目的。

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_name以及file_A

中的频率

bash $ cat file_B

file_name1 2
file_name2 3

我希望输出为:(frequency,file_name,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)

如何在第一个字段中获取频率字段?

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

谢谢,

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

注意join不支持在输出格式中指定一系列字段,因此以下内容有点hacky,但在“代码行”中最多支持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

答案 2 :(得分:0)

sed 's#([^ ]*) ([^ ]*) (.*)#$2 $1 $3#g'

注意:也许您必须使用退格键逃避常规括号才能使其正常工作。