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)を繰り返すときに現在のキーが最初のファイルにあることを確認し、そうである場合は、現在の値を最初のファイルで見つかった値に置き換えます。