ファイル内の番号に基づいて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