2016-03-30 9 views
1

bashで問題が発生したので、最近使用し始めました。 私の前の質問がそれによって解決されたので、沢山の魔法のことがちょうど1行で済むことが分かりました。 今回の質問は簡単です:いくつかの行が文字列の場合、ファイル内の行を順序付ける方法

私はこの形式を持つファイル

2 2 10 
custom 
8 10 
3 5 18 
custom 
1 5 

文字列customに等しいライン(それは任意の行することができます!)と他の行の一部が2つのまたは3の数字を持っているを持っていますその中に。 は私が(順序も同じでなければなりません)番号の行を配列が、カスタムでラインを維持するファイルをしたいので、所望の出力は、私もこの1と、入力ファイルを上書きしたい

2 4 6 8 10 
custom 
8 9 10 
3 8 13 18 
custom 
1 2 3 4 5 

です。 私はseqを使ってシーケンシングを行うことができますが、私はそれをファイルにするエレガントな方法を望んでいます。

答えて

3

あなたはこのようなawkを使用することができます。

awk '/^([[:blank:]]*[[:digit:]]+){2,3}[[:blank:]]*$/ { 
    j = (NF==3) ? $2 : 1 
    s="" 
    for(i=$1; i<=$NF; i+=j) 
     s = sprintf("%s%s%s", s, (i==$1)?"":OFS, i) 
    $0=s 
} 1' file 

2 4 6 8 10 
custom 
8 9 10 
3 8 13 18 
custom 
1 2 3 4 5 

説明:

  • から2つのまたは3の数字でのみ行と一致します。
  • j = (NF==3) ? $2 : 1から3列がある場合はそうでなければ、最後のCOLに1 COLからループを実行j1から
  • for(i=$1; i<=$NF; i+=j)を設定し、j
  • sprintfによる増分が生成されたシーケンス
  • をフォーマットするために使用される $2可変 jを設定します
  • 1は、各行を印刷するデフォルトのawkアクションです。
+1

カスタムは任意の行で、おそらく '1 strange line'です。問題から明確ではない、まっすぐな解決のためにupvote。 –

+0

動作しませんでした。たぶん私はもっと明確にすべきだった、任意の行はカスタムに等しいことができ、それは文字通り "カスタム"の文字列、他の行は2〜3の数字を持つことができ、行の任意の数字にすることができます。それは2 2 10であった。カスタム; 2 6 10;カスタム; 1 5(;行を表します)、2 6 10の出力は2 6にする必要があります - 私は文字通り、カスタムと同じでない行でseqコマンドを実行したいと思っています –

+0

助けがあれば、ファイルは1,2,3ライン。私はもっ​​と一般的な解決策を望んでいたので言及しなかった。ファイル内の行の最大数が3であるため、私はこの問題を手作業で多く解決することができます。これは8つすべてのケースを処理するelse文ですが、より洗練された解決策を望んでいました。 –

0

これはあなたのために働くかもしれません(GNU sed、seq、p ASTE):線は、数字で始まる

sed '/^[0-9]/s/.*/seq & | paste -sd\\ /e' file 

場合、コマンドを貼り付けるパイプれる配列コマンドのパラメータとしてライン値を使用します。代替コマンドのRHSは、eフラグ(GNU sed固有)を使用して評価されます。

関連する問題