找到一行并在给定输入的csv文件中修改它

问题描述 投票:0回答:2

我有一个带有工作列表的csv文件,我想制作一个脚本来修改他们的工作组给出他们的ID。 CSV文件中的行是这样的:

之前:

ID           TAG GROUP
niub16677500;B00;AB0

后:

ID           TAG GROUP
niub16677500;B00;BC0

我怎么能做到这一点?我正在使用awksed命令,但此刻我无法得到任何东西。

linux bash awk sed
2个回答
1
投票

使用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选项进行内联更改,也可以将输出重定向到文件。

说明:

  • 将值存储在2个变量中
  • /^$id/当你到达一个以变量id中的ID存储开头的行时,运行sed search并替换
  • s/;[^;]*$/;$new_group/搜索和替换将用新值替换最后一个字段的命令

0
投票

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是一个很好的资源,你应该看看它。

© www.soinside.com 2019 - 2024. All rights reserved.