我正在尝试使用 awk 变量替换同一行中特定条件为真的字符串。
我发现了一些可以对我有很大帮助的东西,但我面临着新的挑战,因为我需要使用变量来做到这一点。
这是我的内容文件的示例。
0;20220808163547;
1224;20220808163547;
1224;20220808170514;
0;20220808170514;
当第二列与值匹配时,我总是需要替换第一列20220808170514
。
感谢其他帖子我可以完成它。 https://stackoverflow.com/questions/20664446/bash-replace-string-where-specific-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
) 与变量中的值相同,就可以替换第一个字段 ( $1
)。它需要将输入和输出字段分隔符(FS
和OFS
)设置为;
文件中使用的分隔符。