我是新手,只是想知道是否有人可以提供帮助:)。
我有一个这样的文件:
start1
12.3
13.2
15.3
end1
如何找到字符串end1并在字符串前添加几行,所以它看起来像:
start1
12.3
13.2
15.3
NaN
NaN
end1
但添加的行数必须取决于具体的数字,例如5.如果在start1和end1之间只有3个条目,则添加的行数为2.
答案 0 :(得分:2)
您可以使用awk(1)
轻松完成此操作:
awk '/start1/ {start=NR} /end1/ && start {for (i=NR-start;i<=5;++i) {print "NaN"}} 1'
这将记录字符串start1
所在的行,当它看到字符串end1
时,它将输出最多5行NaN,具体取决于相隔多远{{1} }和start1
是。将5改为你需要的任何东西。
答案 1 :(得分: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
答案 2 :(得分:1)
awk -vt=5 '/start1/{print;next;}/end1/{for(x=1;x<=t-i;x++)print "NaN";}++i' file
你只需要替换上面的单行中的5来获得不同数量的“NaN”:)
编辑:开始可能不在第1行。
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
答案 3 :(得分:0)
您可以使用sed
来执行此类操作:
`sed /end1/lineToAdd0\nlineToAdd1\netc\nend1/g < file`
我不确定\n
,我不记得是sed
是否以特殊的方式解释它。
答案 4 :(得分: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 <>;'
答案 5 :(得分: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
答案 6 :(得分: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