fileAで文字列を見つけ、その文字列からいくつかのテキストを選択し、fileBで文字列を置き換える方法は?

fileAで文字列を見つけ、その文字列からいくつかのテキストを選択し、fileBで文字列を置き換える方法は?

ファイルAとファイルBがあります。存在するファイルA、私のスクリプトが特定のstringAを見つけることができるようにしたいです。次に、sedコマンドを使用してstringAの一部のみを貼り付けます。文書B(特定のstringBの一部に置き換えられました文書B)。

例えば。

ファイルA
アジジカ・ハステッド
アシジック・ダジド
推奨重量:0.546(関心文字列です)

文書B
アスダギスクダ
クザッシュ・ザフステッド
ワーキンググループHT      0.495(FILE BIの交換が必要な部分です)

stringA(0.546)のテキストを選択し、fileBの0.495を0.546に置き換えたいので、新しいfileBは次のようになります。

新しいファイルB
アスダギスクダ
クザッシュ・ザフステッド
重量0.546

sed私は同じファイル内のstringAをstringBに置き換えますが、私のstringsAとBが異なるファイルにあるので、使用するのは私には適していません。また、「ランダムに」(プログラミング方式で)生成されます。

答え1

sed(および最初のファイルと一致する他のツール)を使用して実際にこれを行うことができます。たとえば、

$ sed -E "s/(WGHT\s*).*/\1$(grep -oP 'Recommended Weight: \K[0-9.]+' fileA)/" fileB 
asdajskdha
kjashdjahsd
WGHT 0.546

または、まず変数に保存します。

$ wght=$(sed -En 's/Recommended Weight: *([0-9.]+)/\1/p' fileA)
$ sed -E "s/(WGHT\s*).*/\1$wght/" fileB
asdajskdha
kjashdjahsd
WGHT 0.546 

答え2

awk 'FNR==NR && $2 == "Weight:"{ weights[spotted++]=$3} FNR!=NR && $1 != "WGHT" { print } FNR!=NR && $1=="WGHT" { print "WGHT", weights[replaced++]} ' in1 in2 > out2

out2これにより、目的の出力データを含む新しいファイルが作成されます。その後、好きな場所に移動できます。

$ cat out2
asdajskdha
kjashdjahsd
WGHT 0.546

答え3

このスクリプトはnew_file_b.txt

使用法: ./script.sh file_a.txt file_b.txt > new_file_b.txt

#!/bin/bash

awk '
/Recommended Weight: /{
    value=$3;
}
NR != FNR {
    if($1 == "WGHT") {
        print $1 OFS value; 
    } else {
        print;
    }
}
' "$1" "$2"

答え4

GNU sed次のように進むことができます。

sed -Ez '
   N;s/.*\nRecommended Weight: (\S+)\n.*\x00(.*\nWGHT[[:blank:]]+)\S+\n/\2\1\n/
' fileA fileB

-Eオンの場合、extended regex facilityこの-zオプションは各ファイルを単一の文字列として扱い、複数のファイルを\0null()で区切ります。

関連情報