搜索模式并将第6个分隔的单词替换为另一个模式,例如分隔符为“;” (分号)和文件内编辑是首选

时间:2016-04-29 01:58:40

标签: unix solaris

示例文件有6列“;”分离器:

temp;abcd;YES;1234;pqrs;YES

aaaa;bccc;YES;1234;pqrs;YES

ramy;uqq;YES;adda;1234;YES
..

..

..

现在搜索多个模式(要搜索的模式可以是1或更多)说temp和bccc,并在匹配的行中用NO替换第6个(或最后)分隔的单词模式。

即预期输出应为

temp;abcd;YES;1234;pqrs;NO

aaaa;bccc;YES;1234;pqrs;NO

ramy;uqq;YES;adda;1234;YES

..
..
..

进行文件内编辑会非常好,因为我将在递归循环中使用代码,其中要搜索的多个模式将在shell变量中动态分配。 / p>

这样的事情:

var='temp|abcd'

grep $var filename |基于匹配的模式,用NO替换第6个或最后一个工作,文件具有;分隔符。

1 个答案:

答案 0 :(得分:0)

让我们尝试使用

假设您的数据位于a.txt文件中,并且您编写了一小段代码a.awk

#!/bin/awk -f
BEGIN { OFS=";" ;  FS=";" ; print "start\n---------------" }
{
  if ( $0 ~ var )
  { print $1,$2,$3,$4,$5,"NO" }
  else
  { print $0 }
}
END { print "---------------\nend" }
  • NB1:这里有趣的技巧is how to pass a shell variable to hawk
  • NB2:还请注意您如何使用~来解析var内的
  • NB3:上面有很多无用的代码,但很好理解awk如何工作:3部分,中间部分重复输入文件的每一行。

然后您可以调用以下代码:

awk -f a.awk -v var="abcd|temp" a.txt

或者作为一个单行:

 awk -v var="abcd|temp" -F";" \
 '{ if($0~var){print $1";"$2";"$3";"$4";"$5";NO"} else {print} }'  a.txt

要了解有关它的更多信息,请参阅great tutorial