回答:
以下の回答は、いくつかの関連する変更を加えたSOの同様のQ&Aに基づいています。
$ awk 'FNR==NR {dict[$1]=$2; next} {$2=($2 in dict) ? dict[$2] : $2}1' file2.txt file1.txt
item1 platA
item2 platB
item3 platC
item4 platD
item5 platE
アイデアは、インデックス付きのハッシュマップを作成し、辞書として使用することです。
コメントで質問した2番目の質問(2番目の列がfile1.txt
6 番目の列になる場合の変更点):
入力ファイルが次のようになる場合file1b.txt
:
item1 A5 B C D carA
item2 A4 1 2 3 carB
item3 A3 2 3 4 carC
item4 A2 4 5 6 platD
item5 A1 7 8 9 carE
次のコマンドを実行します。
$ awk 'FNR==NR {dict[$1]=$2; next} {$2=($6 in dict) ? dict[$6] : $6;$3="";$4="";$5="";$6=""}1' file2.txt file1b.txt
item1 platA
item2 platB
item3 platC
item4 platD
item5 platE
私はあなたが言ったのを知っていますawk
、しかしjoin
この目的のためのコマンドがあります...
{
join -o 1.1,2.2 -1 2 -2 1 <(sort -k 2 File1.txt) <(sort -k 1 File2.txt)
join -v 1 -o 1.1,1.2 -1 2 -2 1 <(sort -k 2 File1.txt) <(sort -k 1 File2.txt)
} | sort -k 1
次のjoin
行がなければ、最初のコマンドで十分です。
item4 platD
コマンドは基本的に、最初のファイルの2列目(-1 2
)と2番目のファイルの1列目(-2 1
)に基づいて結合し、最初のファイルの1列目と2番目のファイルの2列目()を出力します-o 1.1,2.2
。それはペアになったラインのみを表示します。2番目のjoinコマンドはほとんど同じことを言っていますが、ペアにできなかった最初のファイルの行を表示し(-v 1
)、最初のファイルの最初の列と最初のファイルの2番目の列を出力します(-o 1.1,1.2
)。次に、両方の出力を組み合わせて並べ替えます。sort -k 1
最初の列にsort -k 2
基づいて並べ替えることを意味し、2番目の列に基づいて並べ替えることを意味します。に渡す前に、結合列に基づいてファイルをソートすることが重要join
です。
今、私はそれを助けることができるならファイルで私のディレクトリを散らかしたくないので、私はソートを2回書いた。ただし、David Foersterが言ったように、ファイルのサイズによっては、ファイルを並べ替えて最初に保存し、それぞれを2回並べ替えるのを待たないようにすることができます。サイズのアイデアを与えるために、これは私のコンピューターで100万行と1000万行を並べ替えるのにかかる時間です:
$ ruby -e '(1..1000000).each {|i| puts "item#{i} plat#{i}"}' | shuf > 1million.txt
$ ruby -e '(1..10000000).each {|i| puts "item#{i} plat#{i}"}' | shuf > 10million.txt
$ head 10million.txt
item530284 plat530284
item7946579 plat7946579
item1521735 plat1521735
item9762844 plat9762844
item2289811 plat2289811
item6878181 plat6878181
item7957075 plat7957075
item2527811 plat2527811
item5940907 plat5940907
item3289494 plat3289494
$ TIMEFORMAT=%E
$ time sort 1million.txt >/dev/null
1.547
$ time sort 10million.txt >/dev/null
19.187
100万行で1.5秒、1000万行で19秒です。
%E
、(時間形式の)経過(実際の)時間は、計算パフォーマンスを測定するのにはあまり興味がありません。ユーザーモードのCPU時間(%U
または単に設定されていないTIMEFORMAT
変数)の方がはるかに意味があります。
%U
ます。