あるファイルの列データを別のファイルの行データに置き換える

あるファイルの列データを別のファイルの行データに置き換える

私はLinux環境が初めてで、いくつかのデータを処理するためのスクリプトを書く必要があります。

次のファイルがあります。

ファイルA:

1    X   1    1.0
2    X   1    1.0
3    X   1    1.0
4    Y   2    1.0
5    Y   2    1.0
6    Z   3    1.0

別のファイルは次のとおりです。

ファイルB:

1 0.5
2 0.3
3 0.2

ファイルAの4列目の数字をファイルBの2列目の数字に置き換える必要がありますが、ファイルAの3列目の数字とファイルBの1列目の数字とを一致させる必要があります。

希望の出力は次のとおりです。

1    X   1    0.5
2    X   1    0.5
3    X   1    0.5
4    Y   2    0.3
5    Y   2    0.3
6    Z   3    0.2

答え1

ファイルをソートできない場合は、join区切りデータを処理するように設計されたAwkを使用してください。

この場合、最初のファイルが最初に渡され、ルックアップテーブルが作成され、次に最初のファイルが渡されると、ルックアップテーブルを使用して最初のファイルの各行が変更されます。

$ cat file2
1 0.5
2 0.3
3 0.2
$ cat file1
1    X   1    1.0
2    X   1    1.0
3    X   1    1.0
4    Y   2    1.0
5    Y   2    1.0
6    Z   3    1.0
$ awk 'NR==FNR {a[$1] = $2; next} {$4 = a[$3]} 1' file2 file1
1 X 1 0.5
2 X 1 0.5
3 X 1 0.5
4 Y 2 0.3
5 Y 2 0.3
6 Z 3 0.2
$

答え2

使用join:

join -1 3 -o 1.1,1.2,0,2.2 file1 file2

提供されたファイル出力を使用してください。

$ cat file1
1    X   1    1.0
2    X   1    1.0
3    X   1    1.0
4    Y   2    1.0
5    Y   2    1.0
6    Z   3    1.0
$ cat file2
1 0.5
2 0.3
3 0.2
$ join -1 3 -o 1.1,1.2,0,2.2 file1 file2
1 X 1 0.5
2 X 1 0.5
3 X 1 0.5
4 Y 2 0.3
5 Y 2 0.3
6 Z 3 0.2
$ 

両方の入力ファイルをソートする必要があります(結合する列に基づいて)。それは事前編集sort -n数字ではなくソートが必要なので、10個以上の項目がある場合は、ファイルを適切にソートする必要があります。 (リゾート加入後、再訪問可能です。)

答え3

入力をソートできないと機能しませんが、join使用できますsed。アイデアは、sed一度使用してfileBをスクリプトに変換し、そのスクリプトを再供給してsedfileAを変換することです。

したがって、1行に標準のPOSIXシェルコマンド置換を使用してください。

sed -e "$(sed 's:^\([0-9]*\) \(.*\)$:s/\1  *[^ ]*$/\1    \2/:' file2)" file1

関連情報