Awk 使用变量替换特定条件为真的字符串

Awk 使用变量替换特定条件为真的字符串

我正在尝试使用 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)。它需要将输入和输出字段分隔符(FSOFS)设置为;文件中使用的分隔符。

相关内容