ryuki999
@ryuki999

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

bashで特定の文字列群を置換する方法

解決したいこと

target.txtのような空白で区切られたファイルがあったとして、一番左側の文字列だけをchange.txtの内容で置き換えたいです。二つのテキストの順番は一致しており、丸ごと置き換えることができれば良いです。何か方法はあるでしょうか?

これをやりたい背景として、解析計算を行なってtarget.txtを作成したのですが、左側の部分だけ古い情報であることが発覚しました。そのため、新しい内容であるchange.txtで置き換えたいと言うのが背景です。

  • 環境(Fedora version36)
target.txt
 1.Australia/ACT3126/2022  303  143	0.0573
 2.Australia/ACT3126/2022  302  113	0.0573
 3.Australia/ACT3126/2022  301  133	0.0573
 4.Australia/ACT3126/2022  300  143	0.0573
...(20万行程度)
change.txt
 1.Australia/ACT3126/2022
 2.Australia/ACT3248/2022
 3.Australia/ACT4235/2022
 Australia/ACT3126/2022
...(20万行程度)

自分で試したこと

pythonで二つのファイルを配列として読み込んで、置き換えるということはできます。ただ、シェルで出来れば早そうだし楽だと考えたので、方法が知りたいです。難しいもしくはないという回答でも大丈夫です。

0

1Answer

paste -d ' ' change.txt target.txt | cut -d ' ' -f 1,3-

でできます。この paste は両ファイルから1行ずつ読み取ってはスペースで連結した行を出力します。 cut はその出力から1列目と3列目以降を取り出します。

2Like

Comments

  1. @ryuki999

    Questioner

    回答ありがとうございます!めっちゃ簡単にできました。
    文字列中に空白が入っている場合があったので、カンマ(,)区切りで行い、一瞬で書きかえられました。非常に助かりました。

    ```
    paste -d , change.txt target.txt | cut -d , -f 1,3- > change.txt
    ```
  2. 解決したようでよかったです。ちなみにそうやって change.txt を読むコマンドに > change.txt を繋げると読み取り中のファイルに上書きしてデータが壊れます。書き出す先は別のファイルにしたほうがいいです。
  3. @ryuki999

    Questioner

    なるほど、ありがとうございます!

Your answer might help someone💌