Awk 在条件中为特定条件插入行

Awk 在条件中为特定条件插入行,awk,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后的行 如果是$1=b和$3=5,我想插入两个

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

我的问题是,我必须在/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后的行

如果是$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 }
我能自己管理的最好的awk是:

if ($1=="b" && $3=="5") {print; print $1 FS "custom text" FS $3 FS "custom text" FS $5 $6 ;next}1}
这将插入一行,但不打印其他行

我通过搜索找到的其他代码片段,我只理解了一部分,但这些代码片段从未为我工作过:

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

你可以试试这样的

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 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
我工作!你能帮我翻译一下你的awk吗?除了第1行和第3行之外,其他所有内容都远远落后于我的理解:)出于我的目的,我不得不更改为OFS=“;”,它仍然有效。有关$1=$1@prestalearner如果希望输出之间用
分隔s为什么在问题中用其他东西(空格)分隔所需的输出?我不明白你的思维过程。。。。“我想要一个香蕉”->“这是一个香蕉”->“好的,但我实际上想要一个葡萄”。事实上,在我读到这篇文章之前,我一直认为你的问题很清楚,所以我对你的问题投了更高的票!我认为这会更容易复制;从这里分离输入用于测试。我还认为,如果通过空格/制表符进行标记,可以更容易地收集我希望的输出。我不是程序员,也不使用Linux。我很难找到一种方法来测试AWK,并通过跟踪和错误学习,手头上所有的AWK手册都是在Windows中完成的。事实上,我现在可以在文本编辑器中编写脚本,并通过一个不错的工具查看输入/输出,虽然我知道你是专业的教学和编码人员,但输入量要比你少一点。我的初衷是好的。@prestalearner使用
$2==2&&$3==3&&f
而不是
$2==“2”&&$3==3
我在帖子中解决了这个问题
f
只是一个变量
f=1
f
设置
true
值相同