【问题标题】:Awk syntax in a loop循环中的 awk 语法
【发布时间】:2017-05-15 21:55:04
【问题描述】:

我在 stackoverflow 上发现了这个关于从匹配 (row4) (link) 打印的 awk,并结合了处理多个文件的功能,因为每次打开新文件时都会重置匹配指示符。 输入file1、file2、file 3每次都是这样的:

row1;something;in;this;row;;;;;;;
row2;something;in;this;row;;;;;;;
row3;something;in;this;row;;;;;;;
row4;don't;need;to;match;the;whole;line,;
row5;something;in;this;row;;;;;;;
row6;something;in;this;row;;;;;;;
row7;something;in;this;row;;;;;;;
row8;something;in;this;row;;;;;;;
row9;something;in;this;row;;;;;;;
row10;something;in;this;row;;;;;;;

输出应该是这样的:

works something in this row
row6 something in this row
row8 something in this row
row9 something in this row
row10 something in this row
works something in this row
row6 something in this row
row8 something in this row
row9 something in this row
row10 something in this row
works something in this row
row6 something in this row
row8 something in this row
row9 something in this row
row10 something in this row

在这里link的原始线程中说可以简单地添加

... $1=="row5"{$6=$5; $5=""} ...

如果匹配条件对命令为真,则为了“移动”字段:

awk 'FNR==1{p=0} p; /row4/{p=1} ' file1 file2

但是我必须在哪里添加这个?我尝试了我看到的所有组合,但没有奏效。在我的情况下,我还想在匹配“第 7 行”之后删除一行,并更改字段 $1,如果它是 ==“第 5 行”

if ($1=="row7") {next};
if ($1=="row5") {$1="works"}

在我的例子中,我将规则放入一个文件:test.awk 并保存以备后用。然后我这样称呼它:

   gawk -f test.awk *.csv 

(file1.csv、file2.csv 和 file3.csv)。如果我将它们放在 p 规则之前,这两个新条件仍然会被忽略:

FNR==1     {p=0} 
 $1=="row5" {$5="works"}
 $1=="row7" {next}
 p; 
/row4/{p=1} 

【问题讨论】:

  • 我对您要执行的操作感到困惑 - 您的输入文件样本和相应的输出会使事情更清楚。
  • 先生。 Fenech,有一个对我有用的原始命令。这是典型的。我想添加两个 if 条件,例如: IF ($1=="row5") {$6=$5; $5=""}; IF ($1=="row7") {下一个};和其他命令。但我不知道如何添加它们。就我而言,如果我将它们放在原始 awk 之前、之后或中间,则它不起作用。
  • 我的猜测是条件应该在您评估条件p 之前进行,但如果没有样本输入和所需的输出,我无法确定。如果您向我们提供可重现的测试用例,那么我相信有人可以解决您的问题。

标签: awk


【解决方案1】:
awk -F';' 'FNR==1     {p=0} 
           $1=="row5" {$6=$5; $5=""}
           $1=="row7" {next}
           p; 
           /row4/     {p=1}' file1 file2

pp!=0{print}的缩写,你要应用的条件应该在打印之前,否则不可见。

【讨论】:

  • 我看到了卡拉克法。在我问之前我也试过了,但它仍然不起作用。
  • 在我的例子中,我将命令放入一个文件:test.awk 并保存以备后用。然后我以这种方式调用它:gawk -f test.awk *.csv(file1.csv、file2.csv 和 file3.csv)。这两个新条件仍然被忽略。
  • 您缺少字段分隔符,请添加-F';' 选项。
  • 对我感到羞耻 :( 我有一个标签作为分隔符,但将文件命名为 *.csv。由于我后来处理使用 ';' 分隔符的文件,所以我现在更改了它并且它可以工作。谢谢你 Karakfa 的时间!
猜你喜欢
  • 2013-12-28
  • 2015-04-16
  • 2014-02-19
  • 1970-01-01
  • 2014-04-04
  • 2017-03-31
  • 1970-01-01
  • 2018-05-16
  • 1970-01-01
相关资源
最近更新 更多