1

我是新手,只是想知道是否有人可以提供帮助:)

我有一个这样的文件:

start1  
12.3  
13.2  
15.3  
end1

我如何找到字符串 end1 并在字符串之前添加几行,所以它看起来像:

start1  
12.3  
13.2  
15.3  
NaN  
NaN  
end1

但是添加的行数必须取决于特定的数字,比如 5。如果它在 start1 和 end1 之间只有 3 个条目,则添加的行数是 2。

4

7 回答 7

2

你可以很容易地做到这一点awk(1)

awk '/start1/ {start=NR} /end1/ && start {for (i=NR-start;i<=5;++i) {print "NaN"}} 1'

这将记录 stringstart1所在的行,当它看到 string 的行时end1,它将输出最多 5 行 NaN,具体取决于相距多远start1end1距离。将 5 更改为您需要的任何内容。

于 2013-01-09T13:17:24.863 回答
1
awk -vt=5 '/start1/{print;next;}/end1/{for(x=1;x<=t-i;x++)print "NaN";}++i' file

您只需替换上面单行中的 5 即可获得不同数量的“NaN”:)

编辑:开始可能不在第一行。

awk -vt=5 '/start1/{i=0;print;next;}/end1/{for(x=1;x<=t-i;x++)print "NaN";}++i' file

测试

kent$  cat t
Empty lines followed




foo
foo1
start1  
12.3  
13.2  
15.3  
end1
bar
bar2

kent$  awk -vt=5 '/start1/{i=0;print;next;}/end1/{for(x=1;x<=t-i;x++)print "NaN";}++i' t
Empty lines followed




foo
foo1
start1  
12.3  
13.2  
15.3  
NaN
NaN
end1
bar
bar2
于 2013-01-09T13:14:06.450 回答
1

真的不清楚你提到的那个数字是你从文件内容中得出的还是你可能编程的东西,但试试这个:

awk '
/start/ { c=0 }
/end/   { for (i=1; i<c; i++) print "NaN" }
{ print; ++c }
' file

并让我们知道任何问题。

编辑:如果存在少于 5 行,则添加 c 行:

awk '
/start/ { c=0 }
/end/ && c<5  { for (i=1; i<c; i++) print "NaN" }
{ print; ++c }
' file

或最多填充 5 行:

awk '
/start/ { c=0 }
/end/   { for (i=c; i<=5; i++) print "NaN" }
{ print; ++c }
' file
于 2013-01-09T12:50:27.677 回答
0

这可能对您有用(GNU sed):

sed -r '/^start/!b;n;:a;/\nend/bb;$!{N;ba};:b;/(\n[^\n]*){5}/!s/$/\nNaN/;tb;s/(\nend[^\n]*)(.*)/\2\1/' file
于 2013-01-09T16:04:56.167 回答
0

这更适合awk设置c为您需要的数字:

$ awk -vc=5 '/start/{n=0}/end/{for(i=0;i++<c+1-n;)print"NaN"}++n' file
start1  
12.3  
13.2  
15.3  
NaN
NaN
end1

$ awk -vc=8 '/start/{n=0}/end/{for(i=0;i++<c+1-n;)print"NaN"}++n' file
start1  
12.3  
13.2  
15.3  
NaN
NaN
NaN
NaN
NaN
end1
于 2013-01-09T13:12:10.290 回答
0

我承认我不知道用 Sed 做你想做的事情的简单方法。有人可能会发布一个 Awk 答案,这很好,但如果有人不介意启动 Perl 解释器的运行时成本,这也可以:

perl -we 'print until eof() or ($_ = <>) =~ /^start1\s*$/; exit if eof(); print; my $i = 5; --$i, print until eof() or ($_ = <>) =~ /^end1\s*$/; --$i, print "NaN\n" until $i <= 0; print; print <>;'
于 2013-01-09T13:03:13.443 回答
0

你可以用sed做这样的事情:

`sed /end1/lineToAdd0\nlineToAdd1\netc\nend1/g < file`

我不确定\n,我不记得它是否sed以一种特殊的方式解释它。

于 2013-01-09T12:48:39.390 回答