Printing 读取文件并根据条件执行一些写入操作

Printing 读取文件并根据条件执行一些写入操作,printing,awk,count,skip,Printing,Awk,Count,Skip,我是awk的新手。我自己到处寻找,想弄明白这一点,但失败了。这是我最后的办法。请帮忙 我有一个非常大的文件,如下所示 *SET 7 636322 635890 632043 632044 636323 636322 632044 632045 *SET 8 636315 636323 632045 632046 *SET 9 635890 635889 635992 635994 635994

我是awk的新手。我自己到处寻找,想弄明白这一点,但失败了。这是我最后的办法。请帮忙

我有一个非常大的文件,如下所示

*SET
     7
636322    635890    632043    632044
636323    636322    632044    632045
*SET
     8
636315    636323    632045    632046
*SET
     9
635890    635889    635992    635994
635994    635992    635991    635993
635995    635991    635992    635996
635996    635992    635889    635888
我想让它看起来像这样

1    636322    635890    632043    632044
1    636323    636322    632044    632045
2    636315    636323    632045    632046
3    635890    635889    635992    635994
3    635994    635992    635991    635993
3    635995    635991    635992    635996
3    635996    635992    635889    635888
基本上有一个条件,即查找字符串“SET”并跳过一行在第一列中添加计数id,打印该行的其余部分,直到看到下一个“SET”。继续,直到文件结束。提前感谢。

分阶段进行

awk '/SET/ { counter++ }
     NF == 4 {printf("%d\t%s\n", counter, $0); }'
首先,处理递增计数器的问题。您要匹配的模式是“SET”,因此在BEGIN块中定义一个变量,并在找到模式“SET”时增加它

接下来,查找输入中的其他重要行。不要操心空白行——如果它们与你定义的任何模式不匹配,没有什么会发生。

您的其他行与模式匹配:“行开始”“编号”

$0表示“与当前模式匹配的整条线”

当您遇到其中一行时,您希望输出cntr和$0


<>希望这是足够的提示,让您了解AWK

>“代码> 7代码>代码>代码> 8代码< >代码> >代码> 9 <代码>哦,请忽略注释中的空行。由于一些奇怪的原因,当我试图删除空白行时,带有单个数字的行开始与字符串集相结合:-(在我的文件中,我将在这里操作,没有空行。抱歉混淆了。学习如何在这样做标记。如果您想发布文字或代码,请用鼠标标记并使用<代码>。{}code工具。用4个空格缩进的行是文字代码。感谢@Barmar的提示。我正在学习。非常感谢Barmar。这会在找到/SET/?后跳过一行吗?它会忽略除
SET
NF==4
之外的所有行。不确定这应该如何解决OPs问题。
echo
在这里做吗?明白了。事实上,我的文件中根本没有空行。我必须在我的笔记中添加它们,以防止两行由于某些不恰当的原因合并。我明白了你的建议。我怎么能忽略紧跟在/SET/之后的行。谢谢。我认为Barmar的回答涵盖了所有内容。对于awk,如果一行没有匹配模式,什么也没发生。
BEGIN {
cntr=1
}

/SET/ {
   cntr++;
   echo cntr;
}