我想根据文件中的编号连接两个文件,两个编号相同的文件
Toyota model1
BMW model2
Benz model3
BMW model4
BMW model5
Benz model6
Benz model7
和第二个文件
class C model1
class E model2
class A model3
class W model4
class W model5
class C model6
class A model7
我想根据编号将两个文件连接起来,就像这样,将每个型号彼此连接在一个文件中。
Toyota class C model1
BMW class E model2
Benz class A model3
BMW class W model4
BMW class W model5
Benz Class C model6
Benz Class A model7
之后删除“模型”字符串
我的代码,
sort -V file1 > new_file1
sort -V file2 > new_file2
join newfile1 new_file2 > result.txt
sed 's/model[(1-9)]//g' result.txt > result_1.txt
问题 我在加入文件时遇到错误
join: file1.txt:10: is not sorted: 03Benz model 249
join: file2.txt:4: is not sorted: BMW model 2
如果我想在那之后计算频率怎么办
( this pair happen in the text 2 times) after joined
Toyota class C 1
BMW class E 1
Benz class A 2
BMW class W 2
Benz Class C 1
答案1
使用join
。
看起来将文件中的第一个空格字符更改为空格以外的字符足以转换文件以空格分隔的记录。
下面是一个实现,它将第一个空格替换为%
,然后连接到每个文件的第二列。
$ cat file2 | sed -e 's/ /%/' | join -1 2 -2 2 - file1
或者
$ <file2 sed -e 's/ /%/' | join -1 2 -2 2 - file1
产生
model1 class%C Toyota
model2 class%E BMW
model3 class%A Benz
model4 class%W BMW
model5 class%W BMW
model6 class%C Benz
model7 class%A Benz
如果需要将其转换为制表符分隔格式,可以使用tr
.
tr ' %' '\t '
答案2
Join 是正确的工具,除了排序文件之外,您不需要任何其他转换。
join -12 -23 -o 1.1 2.1 2.2 0 file1 file2 |column -t
Toyota class C model1
BMW class E model2
Benz class A model3
BMW class W model4
BMW class W model5
Benz class C model6
Benz class A model7
Join 默认情况下处理以空格分隔的字段。
选项 -12 表示第一个文件第二个字段
选项 -23 表示第二个文件第三个字段
选项 -o 表示格式输出:
1.1 = file1 字段 1
2.1 = file2 字段 1
0 = 公共/连接字段
在排序和连接命令前面应用LC_ALL=C,以确保正确排序和正确连接(即LC_ALL=C排序文件)
关于计数部分,你可以这样做:
join -12 -23 -o 1.1 2.1 2.2 0 file1 file2 |cut -d' ' -f1-3 |sort |uniq -c
1 BMW class E
2 BMW class W
2 Benz class A
1 Benz class C
1 Toyota class C