Awkは変数を使用して、特定の条件に対応する文字列を置き換えます。

Awkは変数を使用して、特定の条件に対応する文字列を置き換えます。

特定の条件がtrueの同じ行の文字列を置き換えるためにawk変数を使用しようとしています。

私には多くの役に立つものが見つかりましたが、これには変数を使用する必要があるため、新しい難関に直面しました。

以下は私のコンテンツファイルの例です。

0;20220808163547;
1224;20220808163547;
1224;20220808170514;
0;20220808170514;

2番目の列が値と一致する場合は、常に1番目の列を置き換える必要があります20220808170514

他の投稿のおかげで完了できました。 https://stackoverflow.com/questions/20664446/bash-replace-string-where-special-condition-is-true

これは素晴らしい作品です。

awk '/20220808170514/ {sub(/0/,"2048")}1' FileName.ctrl

ただし、これは動的な方法で行う必要があります。

v1=2048
v2=20220808170514
awk -v var1="$v1" -v var2="$v2" '/var2/ {sub(/0;/,var1";")}1' FileName.ctrl

しかし、それはうまくいきませんでした。

0;20220808163547;
0;20220808163547;
0;20220808170514;
0;20220808170514;

これが必要です。

0;20220808163547;
1224;20220808163547;
2048;20220808170514;
2048;20220808170514;

PS:v1とv2のリリース時期は異なります。

ベストアンサー1

私は次のことを提案したいと思います:

$ awk -v FS=';' -v OFS=';' -v var1="$v1" -v var2="$v2" '$2 == var2 { $1 = var1 } 1' filename 
0;20220808163547;
1224;20220808163547;
2048;20220808170514;
2048;20220808170514;

まず、行を変数のパターンと一致させる方法はです$0 ~ var。ただ/var/文字通りの正規表現として扱ってください。その後、sub(/0;/, ...)最初のフィールドだけが置き換えられ、0何も置き換えられません1224

ただし、フィールド区切り文字を正しく設定すると、$22番目のフィールド()が変数と同じ値を持つ限り、最初のフィールド()を置き換えることができます$1。入力フィールドと出力フィールドの区切り記号(FSおよび)をファイルで使用される区切り文字OFSに設定する必要があります。;

おすすめ記事