私はここに初めて来て、まだ投稿をたくさんしていません。その点を明確にしようと努力します。
文字列を含む行を識別する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.csv
5つの行があり、replace.csv
4つしかないためです。)
次の文字列を含む行全体を置き換えるには、次のようにします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スクリプトを基本ファイルで実行する前にスキャンおよび/または編集できます。