ファイルの各行の後半を別のファイルの対応する部分に置き換えます。

ファイルの各行の後半を別のファイルの対応する部分に置き換えます。

A、B 2つのファイルがあります。両方のファイルの各行はエントリと見なされます。各項目の形式は固定されており、スペースで区切られたキーと説明で構成されています。次の例に示すように。

UASCH-XCF02-SP062 /users/documents/ark

最初の部分UASCH-XCF02-SP062がポイントで、最後の部分が/users/documents/ark説明です。ファイルAとBにはそれぞれ1000個と100000個のエントリがあります。同じファイルの各キーは一意ですが、ファイルAのエントリのキーはファイルBにも表示されますが、説明は異なります。次の簡単な例で見ることができます。

ファイルA

UASCH-XCF02-SP062 /users/documents/ark1
UASCH-XXF02-SP063 /users/documents/ark2

文書B

UASCH-XCF02-SP062 /users/documents/ark3
UASCH-XXF02-SP063 /users/documents/ark4
UASCH-XXF03-SP064 /users/documents/ark5

ファイルBの同じキーに対応する説明をファイルAのキーに対応する説明に置き換えたい。例の結果は次のとおりです。

文書B

UASCH-XCF02-SP062 /users/documents/ark1
UASCH-XXF02-SP063 /users/documents/ark2
UASCH-XXF03-SP064 /users/documents/ark5

この目標を達成する方法は?

ベストアンサー1

これはAWKを使用して行うことができます。

$ awk 'NR==FNR{a[$1]=$2;next} $1 in a {$2=a[$1]} 1' A.txt B.txt
UASCH-XCF02-SP062 /users/documents/ark1
UASCH-XXF02-SP063 /users/documents/ark2
UASCH-XXF03-SP064 /users/documents/ark5

編集:Edのコメントにより、AWK式の後半を簡素化しました。

ファイルBを編集するには、AWK出力を一時ファイルにリダイレクトし、ファイルBをそのファイルに置き換えます。

awk 'NR==FNR{a[$1]=$2;next} $1 in a {$2=a[$1]} 1' A.txt B.txt >B.txt.tmp
mv B.txt.tmp B.tmp 

仕組み。まずNR==FNR、最初のファイルと2番目のファイルを区別するイディオムを使用して、最初のファイル(A)のすべてのキーと値のペアを連想配列に保存します。次に、2番目のファイル(B)を繰り返すときに現在のキーが最初のファイルにあることを確認し、そうである場合は、現在の値を最初のファイルで見つかった値に置き換えます。

おすすめ記事