ガイドファイルの列を使用して一致する複数の文字列を置き換える

ガイドファイルの列を使用して一致する複数の文字列を置き換える

2つのファイル(FileAとFileB)があります。

ファイルA:

s12 >g01
s16 >g02
s48 >g03
s52 >g04
s80 >g05
s81 >g06
s87 >g07
s91 >g08
s92 >g09
s93 >g10
s94 >g11
s96 >g12
s97 >g13
s98 >g14
s99 >g15
s100 >g16

ファイルB:

s12:1148.1652412 [PCC6803]
ABCDEFGHIJKLMNOPQRST
s16:1235.1653193 [PCC6803]
UVWXYZABCDEFGHIJKLMN
s48:5877.1652308 [PCC6803]
OPQRSTUVWXYZABCDEFGH
.
.
.

FileB内のすべての「FileAの列1文字列」が「FileAの列2文字列」に変更されるようにFileBを編集したいと思います。

希望の出力:

>g01 [PCC6803]
ABCDEFGHIJKLMNOPQRST
>g02 [PCC6803]
UVWXYZABCDEFGHIJKLMN
>g03 [PCC6803]
OPQRSTUVWXYZABCDEFGH

同じFileB形式で約20個のファイルを編集する必要があります。

この種の編集を行うコマンドはありますか?同時に実行されますか、またはLinuxターミナルで1行のコマンドを使用して実行されますか?よろしくお願いします!

更新:次の例を試しました。複数の文字列をマッピングされた文字列の別のセットに置き換える しかし、うまくいきません。

replacements=(
        s12:\>g01
        s16:\>g02
        s48:\>g03
        s52:\>g04
        s80:\>g05
        s81:\>g06
        s87:\>g07
        s91:\>g08
        s92:\>g09
        s93:\>g10
        s94:\>g11
        s96:\>g12
        s97:\>g13
        s98:\>g14
        s99:\>g15
        s100:\>g16
)

for row in "${replacement[@]}"; do
        original="$(echo $row | cut -d: -f1)";
        new="$(echo $row | cut -d: -f2)";
        sed -i -e "s/${original}/${new}/g" FileB;
done

ベストアンサー1

$ awk 'FNR==NR { id[$1]=$2; next } { split($1,a,":"); if (a[1] in id) $1=id[a[1]]; print }' fileA fileB
>g01 [PCC6803]
ABCDEFGHIJKLMNOPQRST
>g02 [PCC6803]
UVWXYZABCDEFGHIJKLMN
>g03 [PCC6803]
OPQRSTUVWXYZABCDEFGH

最初のブロックは、fileA最初のファイル()を読み取るときにのみトリガーされます。s*文字列をキーとして文字列間マッピングを連想配列として読み込みます>g*ids*

2番目のブロックは、2番目のファイル()を読み取るときにのみトリガーされますfileB。各行の最初のフィールドを:一時配列に分割しますa。分割結果の最初の要素が配列のキーである場合、id最初のフィールド全体がそのキーの値に置き換えられます。次に、変更された可能性がある行を印刷します。

FNR行番号です(実際にはレコード番号ですが、デフォルトではレコードは行です)。現在のファイルで、はNR完全な行番号です。したがって、FNR==NR最初のファイルから読んでください。

おすすめ記事