我是新手,只是想知道是否有人可以提供帮助:)
我有一个这样的文件:
start1
12.3
13.2
15.3
end1
我如何找到字符串 end1 并在字符串之前添加几行,所以它看起来像:
start1
12.3
13.2
15.3
NaN
NaN
end1
但是添加的行数必须取决于特定的数字,比如 5。如果它在 start1 和 end1 之间只有 3 个条目,则添加的行数是 2。
你可以很容易地做到这一点awk(1)
:
awk '/start1/ {start=NR} /end1/ && start {for (i=NR-start;i<=5;++i) {print "NaN"}} 1'
这将记录 stringstart1
所在的行,当它看到 string 的行时end1
,它将输出最多 5 行 NaN,具体取决于相距多远start1
和end1
距离。将 5 更改为您需要的任何内容。
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
真的不清楚你提到的那个数字是你从文件内容中得出的还是你可能编程的东西,但试试这个:
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
这可能对您有用(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
这更适合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
我承认我不知道用 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 <>;'
你可以用sed
做这样的事情:
`sed /end1/lineToAdd0\nlineToAdd1\netc\nend1/g < file`
我不确定\n
,我不记得它是否sed
以一种特殊的方式解释它。