2011-01-19 10 views
0

私はこのようなデータのセットを繰り返し生成するシェルスクリプト、foo.shを、持っているとしますsedでラインパターンをフィルタリングする方法はありますか?

<name 1> 
<address 1> 
<mother's name 1> 
<pet's name 1> 
<comment 1> 
<name 2> 
<address 2> 
<mother's name 2> 
<pet's name 2> 
<comment 2> 
... 

私は各5行のブロックから1番目と3番目の行を抽出したいので、変更された出力は次のようになります:

<name 1> 
<mother's name 1> 
<name 2> 
<mother's name 2> 
... 

これらの行に固有のパターンがないので、私は行番号で具体的にフィルタリングする必要があります。これはどうすればできますか?

答えて

4

はsedを:GNUから

sed -n '1~5p;3~5p' file.txt 

は、マニュアルのsed:

first~step 
    Match every step'th line starting with line first. For example, ``sed -n 1~2p'' 
    will print all the odd-numbered lines in the input stream, and the address 2~5 
    will match every fifth line, starting with the second. first can be zero; in 
    this case, sed operates as if it were equal to step. (This is an extension.) 
+0

この行が何をしているかについての簡単な説明(魔法の数字と引数の意味は何ですか? –

3

私はsed専門家ではないんだけど、あなたはAwkの中でこれを行うことができます:

$ awk '(i==0 || i==2) { print } 
         { i = (i+1) % 5 } 
    ' < filename.txt 

あるいは、1行で

$ awk '(NR%5==1 || NR%5==3)' < filename.txt 
+0

これは感謝しました。第2の例では、 – suszterpatt

+0

+1である。リダイレクトを使用する必要はありません。 AWKは引数としてファイル名を受け入れます。 –

1

あなたはawkを使用することはできますか?

awk 'NR % 5 == 1 || NR % 5 == 3' foofile 

だから、基本的に何が起こっているかは

  • awkがfoofileを開くです。
  • それは行番号を5で割り、余りが1または3(すなわち、第1又は5のブロックの3行目)である場合、それは
その行を印刷しているライン
  • によってそれを通る線を読み出しGNUを使用して
  • +0

    コードに "1"と "3"が含まれていると明確になります。 –

    +0

    公正 - 修飾 – jcuenod

    0

    これは、fはうまくいくかもしれませんまたはあなた:

    sed -n 'h;n;n;H;n;n;g;p' file