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