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

时间:2019-03-18 11:50:26

标签: linux bash awk sed

我有一个包含工作人员列表的csv文件,我想根据自己的ID编写脚本来修改其工作组。 CSV文件中的行如下所示:

之前

ID           TAG GROUP
niub16677500;B00;AB0

之后

ID           TAG GROUP
niub16677500;B00;BC0

我该怎么做? 我正在使用awksed命令,但此刻什么都没得到。

2 个答案:

答案 0 :(得分: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中包含的值时,将覆盖第三个字段并打印行

使用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/搜索和替换命令,该命令将用新值替换最后一个字段

答案 1 :(得分:0)

Sed可以做到

echo 'niub16677500;B00;AB0' | sed 's/\(^niub16677500;...;\)\(...\)$/\1BC0/'

通过匹配用户名,分号(任意3个字符和另一个分号),然后匹配其余3个字符,将示例中的AB0组替换为BC0。然后作为输出,它重复与\ 1的第一个匹配并添加BC0。

您可以使用:

sed 's/\(^niub16677500;...;\)\(...\)$/\1BC0/' <old_file >new_file

使用此更改创建一个新文件。

https://www.grymoire.com/Unix/Sed.html是很棒的资源,您应该看一下。