【发布时间】: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