print from match & process several input files

纵饮孤独 提交于 2019-12-25 08:40:27

问题


when you scrutiny my questions from the past weeks you find I asked questions similar to this one. I had problems to ask in a demanded format since I did not really know where my problems came from. E. Morton tells me not to use range expression. Well, I do not know what they are excactly. I found in this forum many questions alike mine with working answers.

Like: "How to print following line from a match" (e.g.)

But all solutions I found stop working when I process more than one input file. I need to process many. I use this command:

gawk -f 1.awk print*.csv > new.txt

while 1.awk contains:

    BEGIN { OFS=FS=";"
pattern="row4"
}
go {print} $0 ~ pattern {go = 1}

input file 1 print1.csv contains:

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;;;;;;;

Input file 2 print2.csv contains the same just for illustration purpose.

The 1.awk (and several others ways I found in this forum to print from match) works for one file. Output:

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;;;;;;;

BUT not when I process more input files. Each time I process this way more than one input file awk commands 'to print from match' seem to be ignored. As said I was told not to use range expression. I do not know how and maybe the problem is linked to the way I input several files?


回答1:


just reset your match indicator at the beginning of each file

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

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;;;;;;;
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;;;;;;;

UPDATE

From the comments

is it possible to combine your awk with: "If $1="row5" then write in $6="row5" and delete the value "row5" in $5? In other words, to move content "row5" in column1, if found there, to new column 6? I could to this with another awk but a combination into one would be nicer

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

or, if you want to use another field instead of $5 replace $5 with the corresponding field number.



来源:https://stackoverflow.com/questions/43327604/print-from-match-process-several-input-files

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!