私は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 -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をスクリプトに変換し、そのスクリプトを再供給してsed
fileAを変換することです。
したがって、1行に標準のPOSIXシェルコマンド置換を使用してください。
sed -e "$(sed 's:^\([0-9]*\) \(.*\)$:s/\1 *[^ ]*$/\1 \2/:' file2)" file1