次のように、ファイルにいくつかの文字列を追加する必要があります。
前のファイル:
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)を処理するときは、スラッシュの後ろの文字列を見て、それを使用してハッシュを抽出して現在の行に戻します。