ファイル内の数値/カウンタに基づいてソートしてリンクする方法は?

ファイル内の数値/カウンタに基づいてソートしてリンクする方法は?

ファイル内の番号に基づいて2つのファイル、つまり同じ番号の2つのファイルをリンクしたいと思います。

Toyota   model1 
BMW      model2
Benz     model3
BMW      model4 
BMW      model5
Benz     model6 
Benz     model7

そして2番目のファイル

class C    model1
class E    model2
class A    model3
class W    model4
class W    model5
class C    model6
class A    model7

このように、数字に基づいて2つのファイルをリンクし、各モデルを1つのファイルにリンクしたいと思います。

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

ファイルの最初のスペース文字をスペース以外の文字に変更すると、ファイルをスペースで区切られたレコードに変換するのに十分なようです。

%以下は、最初のスペースを各ファイルの2番目の列に置き換えてから連結する実装です。

$ 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は、最初のファイルの2番目のフィールドを表します。
オプション-23は、2番目のファイルの3番目のフィールドを表します。
オプション -o は出力形式を示します。
1.1 = file1 field 1
2.1 = file2 field 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

ここで上記のテストをすべてオンラインで見ることができます。

関連情報