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

时间:2014-03-11 20:45:30

标签: 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    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'并跳过一行在第一列中添加一个count-id,打印该行的其余部分继续,直到它看到下一个'SET'。继续,直到文件结束。提前谢谢。

2 个答案:

答案 0 :(得分:2)

awk '/SET/ { counter++ }
     NF == 4 {printf("%d\t%s\n", counter, $0); }'

答案 1 :(得分:0)

分阶段进行。

首先,处理递增计数器。您要匹配的模式是“SET”,因此在BEGIN块中定义一个变量,并在找到模式“SET”时递增它

BEGIN {
cntr=1
}

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

接下来,查看与输入中的其他重要行匹配。不要打扰空白行 - 如果它们与您定义的任何模式都不匹配,则不会发生任何事情。

您的其他行符合模式:“行首”“数字”。

$ 0是awk-代表“与当前模式匹配的整行”。

当您遇到其中一行时,您想要输出cntr和$ 0.

希望这有足够的提示让你在那里,而你学习更多关于awk