我有一个带有工作列表的csv文件,我想制作一个脚本来修改他们的工作组给出他们的ID。 CSV文件中的行是这样的:
之前:
ID TAG GROUP
niub16677500;B00;AB0
后:
ID TAG GROUP
niub16677500;B00;BC0
我怎么能做到这一点?我正在使用awk
和sed
命令,但此刻我无法得到任何东西。
使用awk
:
awk -F';' -v OFS=';' -v id="niub16677500" -v new_group="BC0" '{if($1==id)$3=new_group}1' input.csv
ID;TAG;GROUP
niub16677500;B00;BC0
将输出重定向到文件,并注意csv标头应使用与正文相同的字段分隔符。
说明:
-F';'
将输入字段分隔符设为;
-v OFS=';'
与输出FS相同-v id="niub16677500" -v new_group="BC0"
定义了您将在awk命令中使用的变量'{if($1==id)$3=new_group}1'
当第一列等于变量id
中包含的值时覆盖第3个字段并打印该行使用sed
:
id="niub16677500"; new_group="BC0"; sed "/^$id/s/;[^;]*$/;$new_group/" input.csv
ID;TAG;GROUP
niub16677500;B00;BC0
您可以使用-i.bak
选项进行内联更改,也可以将输出重定向到文件。
说明:
/^$id/
当你到达一个以变量id中的ID存储开头的行时,运行sed search并替换s/;[^;]*$/;$new_group/
搜索和替换将用新值替换最后一个字段的命令Sed可以做到,
echo 'niub16677500;B00;AB0' | sed 's/\(^niub16677500;...;\)\(...\)$/\1BC0/'
将您的示例中的AB0组替换为BC0,方法是匹配用户名,分号,3个字符和另一个分号,然后匹配剩余的3个字符。然后作为输出,它重复第一次匹配\ 1并添加BC0。
您可以使用 :
sed 's/\(^niub16677500;...;\)\(...\)$/\1BC0/' <old_file >new_file
使用此更改创建new_file。
https://www.grymoire.com/Unix/Sed.html是一个很好的资源,你应该看看它。