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'

start1これにより、文字列がどの行にあったかが記録され、文字列の行を確認すると、距離とend1距離に応じて最大5行のNaNが出力されます。5を必要なものに変更します。start1end1

于 2013-01-09T13:17:24.863 に答える
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 に答える
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
于 2013-01-09T13:14:06.450 に答える
0

あなたsedはそのようなことをするために使うことができます:

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

についてはよくわかりませんが、それが特別な方法で解釈されている\nかどうかは覚えていません。sed

于 2013-01-09T12:48:39.390 に答える
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

私はあなたが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

これは、必要な数に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 に答える