如何根据第4列的值替换第3列的值

如何根据第4列的值替换第3列的值

我有一个文件test.txt如下:

000092;;;;2004;;;;N;;;;N

000098;;;;0086;;;;Y;;;;Y

我想根据第三列的值更新第四列的值。如果第 4 列的值为 ,则将N第 3 列的值替换为NA,如果第 4 列的值为 ,Y则将第 3 列的值替换为UPDATE

输出应如下所示:

000092;;;;2004;;;;NA;;;;N

000098;;;;0086;;;;UPDATE;;;;Y

答案1

awk -F ';;;;' -v 'OFS=;;;;' '$4 == "Y" { $3 = "UPDATE" } $4 == "N" { $3 = "NA" } { print; }' test.txt

test.txt问题打印中指定的一样

000092;;;;2004;;;;NA;;;;N
000098;;;;0086;;;;UPDATE;;;;Y

正如问题中所述,我假设您实际上只有 4 个由;;;;(4 个分号)分隔的列,而不是由;(单个分号)分隔的 13 个列。因此,如果 4 组之间有包含附加数据的行,则此脚本将不起作用;

解释:

-F ';;;;'设置输入字段分隔符
-v 'OFS=;;;;'设置输出字段分隔符
$4 == "Y"条件:如果字段 4 是Y
{ $3 = "UPDATE" }操作:修改字段 3与无条件操作
相同:打印(结果)行NNA
{ print; }

答案2

使用 awk,首先设置输入 n 输出字段分隔符,然后在输入数据中查找仅包含 ay 或 n 的记录,然后进行更改,最后打印到 stdout。

$ awk -F';;;;' '
    BEGIN{OFS=FS}
    $4 ~ /^[NY]$/{$3 = ($4 == "N") ? "NA" : "UPDATE"}1
' file

另一种方法可以是:

$ awk -F';;;;' 'BEGIN{OFS=FS;a["N"]="NA";a["Y"]="UPDATE"}
  $4 ~ /^[NY]$/{$3 = a[$4]}1' file

相关内容