停止awk将变量与下一个记录

时间:2017-01-27 09:34:24

标签: bash awk

我的问题如下:我有一个格式化的文件:

1 apple
3 pear
7 lemon

我想要做的是在行上添加空行,这些行不等于第一列中的值,以便它在输出中相等:

1 apple

3 pear



7 lemon

我尝试用awk做到这一点: awk '{for (i=1; i<=10; i++) { if (i==$1) {print $0} else {printf ("\n")}}}' file 但是,当然,它会将每个i与文件中的所有行进行比较,而我希望在操作完成后立即将其停止,但保持循环增加i值。我重写了'awk manual',我尝试了 next break exit 这样的命令,但我没有管理。 谢谢你的任何提示。

3 个答案:

答案 0 :(得分:5)

不使用Array,实际上零内存开销

<强>输入

[akshay@gold tmp]$ cat f
1 apple
3 pear
7 lemon

<强>输出

[akshay@gold tmp]$ awk '{while(++c < $1)print ""}1' f
1 apple

3 pear



7 lemon

有数字

[akshay@gold tmp]$ awk '{while(++c < $1)print c}1' f
1 apple
2
3 pear
4
5
6
7 lemon

答案 1 :(得分:3)

在awk中,(基于预期的输出):

$ awk '{a[$1]=$0;max=$1} END{for(i=1;i<=max;i++) print (i in a?a[i]:"")}' foo
1 apple

3 pear



7 lemon

说明:

  • a[$1]=$0将记录放入哈希a,索引$1
  • max=$1记得最后一句话
  • END迭代,从1到maxprinta迭代,如果匹配或只是换行,否则

答案 2 :(得分:2)

另一个<head> <meta name="csrf-token" content="{{ csrf_token() }}"> ... </head> <body> <form method="post" action="{{ url('/login') }}"> {!! csrf_field() !!} ... </form> </body> 解决方案(不使用数组):

awk

<强>测试

awk 'p{for(i=p+1; i<$1;i++){print ""}} {p=$1; print}' file