如何根据文件内的数字/计数器进行排序和连接?

如何根据文件内的数字/计数器进行排序和连接?

我想根据文件中的编号连接两个文件,两个编号相同的文件

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

您可以在此处在线查看上述两项测试。

相关内容