sed - file1 を使用して、file2 に含まれる file3 行の代替内容を検索します。

sed - file1 を使用して、file2 に含まれる file3 行の代替内容を検索します。

私はここに初めて来て、まだ投稿をたくさんしていません。その点を明確にしようと努力します。

文字列を含む行を識別するfind.csvという3つのファイルに関連する検索と置換を実行したいと思います。行全体をreplacement.csvの1行に置き換えたいです。 3番目のファイルはmainfile.csvで、約1000行が含まれています。

これはこれまでの内容ですが、エラーメッセージが表示されます。

sed "s/$(cat find.csv)/$(cat replace.csv)/" mainfile.csv > out.csv
sed: 1: "s/CHL_13_R4 
DCK_09_R4  ...": unterminated substitute pattern

そのファイルの内容は次のとおりです。

find.csv
CHL_13_R4 
DCK_09_R4 
DCK_10_R4 
DCK_11_R4 
DCK_13_R4 

replace.csv
CHL_13_R12,CHL_13,R12,10/14/2014
DCK_09_R12,DCK_09,R12,10/14/2014
DCK_10_R32,DCK_10,R32,10/14/2014
DCK_11_R21,DCK_11,R21,10/14/2014

デフォルトファイルにはreplacement.csvと同じエントリが含まれていますが、約30個を更新する必要があります。だから最初の行を例にしてみましょう。 mainfile.csvで「CHL_13_R4」の行をCHL_13_R12、CHL_13、R12、10/14/2014に置き換える必要があります。

助けてくれてありがとう!

ベストアンサー1

まず、次の2つのファイルからsedスクリプトを作成します。

paste -d$'\t' find.csv replace.csv | 
    sed -e 's:/:\\/:g; s:\t:/:; s:^:s/:; s:$:/g;:' > myscript.sed

これにより、その文字列のすべての項目がfind.csvの文字列に置き換えられますreplace.csv。行にタブ文字が含まれていると、その文字が結合された行間の区切り文字find.csvとして使用されるため失敗します。paste

出力は次のとおりです。

s/CHL_13_R4/CHL_13_R12,CHL_13,R12,10\/14\/2014/g;
s/DCK_09_R4/DCK_09_R12,DCK_09,R12,10\/14\/2014/g;
s/DCK_10_R4/DCK_10_R32,DCK_10,R32,10\/14\/2014/g;
s/DCK_11_R4/DCK_11_R21,DCK_11,R21,10\/14\/2014/g;
s/DCK_13_R4//g;

(最後の行は置き換えられません。これはfind.csv5つの行があり、replace.csv4つしかないためです。)

次の文字列を含む行全体を置き換えるには、次のようにしますfind.csv

paste -d$'\t' find.csv replace.csv | 
    awk -F$'\t' '{gsub(/\//,"\\/"); print "/"$1"/ s/^.*/"$2"/;"}' > myscript.sed

このバージョンの出力は次のとおりです。

/CHL_13_R4/ s/^.*/CHL_13_R12,CHL_13,R12,10\/14\/2014/;
/DCK_09_R4/ s/^.*/DCK_09_R12,DCK_09,R12,10\/14\/2014/;
/DCK_10_R4/ s/^.*/DCK_10_R32,DCK_10,R32,10\/14\/2014/;
/DCK_11_R4/ s/^.*/DCK_11_R21,DCK_11,R21,10\/14\/2014/;
/DCK_13_R4/ s/^.*//;

とにかく、最も適切なバージョンが何であれ、myscript.sedスクリプトを生成して次のフォルダに入れてくださいmainfile.csv

sed -f myscript.sed mainfile.csv

-i(「in-place」を編集したい場合はオプションmainfile.csv

注:一時ファイル(スクリプトの保存など)を使用せずにこれを実行できますmyscript.sed。ほとんどのsedバージョンは標準入力からスクリプトを実行できます。ただし、この方法では、生成されたsedスクリプトを基本ファイルで実行する前にスキャンおよび/または編集できます。

おすすめ記事