AWK在条件中插入某些条件的行

时间:2017-03-25 14:39:23

标签: awk

我希望我选择正确的头衔。我不是程序员,我还需要学习这个领域的术语。

我的问题是我必须在/ find / {}条件中插入包含一些记录的新行。

以下是示例输入:

1;2;3;4;
b;2;3;4;
txn;2;3;4;
a;2;3;4;
;;;;
b;2;3;4;
b;2;5;4;
b;2;3;4;
;;;;
c;2;3;4;
;;;;

在这里你看到我使用/ txn / {}的原因 - 原始输入有许多我不想在我感兴趣的部分之前打印的行。只有在“txn”第一次出现之后的行。< / p>

如果$ 1 = b且$ 3 = 5,我想插入两个新行。 此外,我需要打印$ 0加上一个新字段,例如。第一个新生产线5美元,打印0美元,新领域打印到6美元。 (最后应该跳过空行。)

结果将是

a   2   3   4
b   2   3   4       
b   2   5   4       
    2   5   4   6   
    2   5   4       7
b   2   3   4       
c   2   3   4

我的首发片段

BEGIN { OFS=FS=";"}

    /^txn/,/^$/ {
    ###### tries to insert line ######
    # eg. if ($1=="b") "\n" ;
    ##################################
    print $1 FS "custom text" FS $3 FS "custom text" FS $5 $6 }

我能管理自己的最佳方法是:

if ($1=="b" && $3=="5") {print; print $1 FS "custom text" FS $3 FS "custom text" FS $5 $6 ;next}1}

这会插入一行,但不会打印其他行。

我通过搜索找到的其他代码片段,我只是部分了解但是neverthelesse对我不起作用的是:

###### tries to insert line ######
last~/b/" && $3=="3" {print "6\n7 "} {last=$1} 1
$1~/b/ {p=1} p && $3=="3"{print "6"; print "7"; p=0} 1'
/txn/ { $0 = $0 RS "6" RS "7"};
for $1'/b/ {$0 = $0 RS "6" RS "8"};
print nl $0; nl="\n"
if ($1~/b/)  print $3 FS "works     INSERTED LINE", "\n" ;

1 个答案:

答案 0 :(得分:1)

您可以尝试这样的事情,

awk 'BEGIN{FS=";";OFS="\t"}
    f && $1!=""{$1=$1; print}
    $1=="b" && $3==5 && f{$1="";$5=6; print; $5=""; $6=7; print}
    $1=="txn"{f=1}' file

你明白了,

a   2   3   4   
b   2   3   4   
b   2   5   4   
    2   5   4   6
    2   5   4       7
b   2   3   4   
c   2   3   4