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*
。id
s*
2番目のブロックは、2番目のファイル()を読み取るときにのみトリガーされますfileB
。各行の最初のフィールドを:
一時配列に分割しますa
。分割結果の最初の要素が配列のキーである場合、id
最初のフィールド全体がそのキーの値に置き換えられます。次に、変更された可能性がある行を印刷します。
FNR
行番号です(実際にはレコード番号ですが、デフォルトではレコードは行です)。現在のファイルで、はNR
完全な行番号です。したがって、FNR==NR
最初のファイルから読んでください。