ループ内の文字列を置き換える

ループ内の文字列を置き換える

次のように、ファイルにいくつかの文字列を追加する必要があります。

前のファイル:

Real/Test1
Real/Test1
Real/Test2
Real/Test3
Real/Test3
Real/Test4

新しいファイル:

Real/Test1  a1 b1 c1 d1
Real/Test1  a1 b1 c1 d1
Real/Test2  a2 b2 c2 d2
Real/Test3  a3 b3 c3 d3
Real/Test3  a3 b3 c3 d3
Real/Test4  a4 b4 c4 d4

列1に古い文字列を含む中間ファイルがあり、次のように新しい文字列が含まれています。

Test1 a1 b1 c1 d1
Test2 a2 b2 c2 d2
Test3 a3 b3 c3 d3
Test4 a4 b4 c4 d4

この問題を解決するのに役立つ人はいますか?

私は非常に原始的な知識を持って、次のことを試しました。

(n1 n2を同時に読み、set n1 n2 sed -i "s / $ n1 / $ n1 $ n2 / g" old>最終的に完了)

ここで「古い」入力と「中間」入力は上記のものです。

ありがとうございます!

答え1

ファイルがリンクされたフィールドの順序で並べられているように見えるので、joinコマンドはかなり簡単に使用できます。

join old <(sed 's;^;Real/;' intermediate)

または (シェルがプロセス置換をサポートしていない場合)

sed 's;^;Real/;' intermediate | join old -

前任者。

$ sed 's;^;Real/;' intermediate | join old -
Real/Test1 a1 b1 c1 d1
Real/Test1 a1 b1 c1 d1
Real/Test2 a2 b2 c2 d2
Real/Test3 a3 b3 c3 d3
Real/Test3 a3 b3 c3 d3
Real/Test4 a4 b4 c4 d4

答え2

GNU awkを使って次のようにしてみてください。

awk -F"[/ ]" 'NR==FNR {a[$1]=$2OFS$3OFS$4;next}$2 in a {print $0,a[$2]}'  intermediatefile oldfile >newfile

答え3

perl -lne '
   @ARGV and $h{$1}=s/(\S+)//r,next;
   s|/(\S+)\K|$h{$1}|;print;
' intermediate.file old.file

結果

Real/Test1 a1 b1 c1 d1
Real/Test1 a1 b1 c1 d1
Real/Test2 a2 b2 c2 d2
Real/Test3 a3 b3 c3 d3
Real/Test3 a3 b3 c3 d3
Real/Test4 a4 b4 c4 d4

説明する

  • 中間ファイル(@ARGV> 0)を使用して最初のフィールドをキーとして使用し、残りのフィールドをその値としてハッシュを埋めます。
  • 古いファイル(@ARGV = 0)を処理するときは、スラッシュの後ろの文字列を見て、それを使用してハッシュを抽出して現在の行に戻します。

関連情報