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

Search for a pattern and replace the 6th delimited word with another pattern, say delimiter is ";" (Semicolon), and in-file editing is preferred

示例文件有 6 列带“;”分隔符:

temp;abcd;YES;1234;pqrs;YES

aaaa;bccc;YES;1234;pqrs;YES

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

..

..

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

即预期输出应该是

temp;abcd;YES;1234;pqrs;NO

aaaa;bccc;YES;1234;pqrs;NO

ramy;uqq;YES;adda;1234;YES

..
..
..

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

像这样:

var='temp|abcd'

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

让我们试着用 来做吧!

假设你的数据在a.txt文件中,你写了一小段代码a.awk:

#!/bin/awk -f
BEGIN { OFS=";" ;  FS=";" ; print "start\n---------------" }
{
  if ( [=10=] ~ var )
  { print ,,,,,"NO" }
  else
  { print [=10=] }
}
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([=12=]~var){print ";"";"";"";"";NO"} else {print} }'  a.txt

要了解更多,这里是 great tutorial