【问题标题】:print from match & process several input files从匹配和处理几个输入文件中打印
【发布时间】:2017-04-10 15:45:26
【问题描述】:

当您仔细查看过去几周我提出的问题时,您会发现我提出了与此类似的问题。我有问题要以要求的格式提出,因为我真的不知道我的问题来自哪里。 E. Morton 告诉我不要使用范围表达式。好吧,我不知道它们到底是什么。我在这个论坛中发现了许多与我类似的问题,并且有有效的答案。

喜欢:“如何从匹配中打印以下行”(e.g.

但是当我处理多个输入文件时,我发现的所有解决方案都会停止工作。我需要处理很多。 我使用这个命令:

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

而 1.awk 包含:

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

输入文件 1 print1.csv 包含:

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

输入文件 2 print2.csv 包含相同内容,仅用于说明目的。

1.awk(以及我在此论坛中找到的从匹配中打印的其他几种方法)适用于一个文件。输出:

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

但不是在我处理更多输入文件时。 每次我以这种方式处理多个输入文件时,awk 命令“从匹配中打印”似乎都被忽略了。 如前所述,我被告知不要使用范围表达式。我不知道问题是如何以及可能与我输入多个文件的方式有关?

【问题讨论】:

    标签: awk gawk


    【解决方案1】:

    只需在每个文件的开头重置匹配指示器

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

    更新

    来自cmets

    是否可以将您的 awk 与:"If $1="row5" then write in $6="row5" 并删除 $5 中的值 "row5"?换句话说,移动 column1 中的内容“row5”(如果在那里找到)到新的第 6 列?我可以 这与另一个 awk 但组合成一个会更好

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

    或者,如果您想使用另一个字段而不是 $5,请将 $5 替换为相应的字段编号。

    【讨论】:

    • 我猜根据 OP 可能有很多文件,然后可能会出现错误,例如打开的文件过多等。
    • 您的猜测不正确。输入文件一次处理一个并正确关闭。
    • 谢谢你 karakfa。最终它起作用了,我离我的目标又近了一步。出于好奇......是否可以将您的 awk 与:“If $1="row5" then write in $6="row5" 并删除 $5 中的值“row5”?换句话说,移动内容“row5”在第 1 列中,如果在那里找到,到新的第 6 列?我可以用另一个 awk 来实现,但组合成一个会更好。
    猜你喜欢
    • 2012-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-03
    • 2021-03-31
    • 2015-05-18
    相关资源
    最近更新 更多