Bash - 如何替换从文件的第二列和第二行开始的字符串?

时间:2018-02-23 06:35:46

标签: bash awk sed

我有一个csv这样的文件

time        my_account  form_token          address         City
13:19:43    username1   aa57d1cd3d5d8845    Street name 1   City 1
13:19:43    username2   aa57d1cd3d5d8846    Street name 2   City 2
13:19:43    username3   aa57d1cd3d5d8847    Street name 3   City 3
13:19:43    username4   aa57d1cd3d5d8848    Street name 4   City 4

我想仅替换my_accountform_token下面的值,因此其他列应该相同而不会被替换。最终结果应该是这样的:

time        my_account  form_token      address         City
13:19:43    OhYeah12345 xxxaaaasssss1   Street name 1   City 1
13:19:43    OhYeah12346 xxxaaaasssss2   Street name 2   City 2
13:19:43    OhYeah12347 xxxaaaasssss3   Street name 3   City 3
13:19:43    OhYeah12348 xxxaaaasssss4   Street name 4   City 4

如果您想下载https://www.dropbox.com/s/t9damejyrlccyam/demo.csv?dl=0

,请输入以下文件

如何使用bash执行此操作? 这就是我所做的:

awk -F ',' -v OFS=',' '$1 {$3="Another Street"; print}' /tmp/demo.csv

但是这个命令也替换了第一行的address,我希望它从第二行开始,而不是

1 个答案:

答案 0 :(得分:0)

您可以使用以下awk命令并将输出重定向到新文件:

$ awk -v var="OhYeah123" -v var2="xxxaaaasssss" 'NR>1{$2=var substr($3,length($3)-1,length($3)); $3=var2 (NR-1); print}NR==1' file.in          
time        my_account  form_token          address         City
13:19:43 OhYeah12345 xxxaaaasssss1 Street name 1 City 1
13:19:43 OhYeah12346 xxxaaaasssss2 Street name 2 City 2
13:19:43 OhYeah12347 xxxaaaasssss3 Street name 3 City 3
13:19:43 OhYeah12348 xxxaaaasssss4 Street name 4 City 4

我已经定义了2个变量,您可以在awk中使用这些变量来替换您想要的任何字段。

  • NR==1将打印第一行
  • NR>1{$2=var substr($3,length($3)-1,length($3)); $3=var2 (NR-1); print}从第二行开始,用变量内容替换第二个字段和第三个字段,然后将它与分别substr($3,length($3)-1,length($3)(NR-1)连接起来,以便输出< / LI>

如果您不需要此逻辑,请使用:

$ awk -v var="OhYeah123" -v var2="xxxaaaasssss" 'NR>1{$2=var; $3=var2;}1' file.in