我有一个文件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与无条件操作
相同:打印(结果)行N
NA
{ 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