2016-10-03 7 views
2

私はファイルがhundred.txtで100行あります。例えばlinuxの3つの連続する行ごとにループする

1 0 0 1 
1 1 0 1 
1 0 1 0 
1 0 1 0 
0 1 1 0 
.... 
1 0 0 1 

私は例えば、私は私の計算を行うために最初の行1-ROW3を使用する必要があり、すべての3つの連続した行内のいくつかの計算を操作する必要があります。

1 0 0 1 
1 1 0 1 
1 0 1 0 

Row2-Row4:

1 1 0 1 
1 0 1 0 
1 0 1 0 

...... Row98-Row100。

各出力はファイル(Row1.txt、Row2.txt、... Row98.txtなど)を生成します。この問題を解決するにはどうすればよいですか?ありがとうございました。

+0

興味があるだけです。これはなぜbashですか? – mascoj

+0

@mascoj私は3つの連続する行の中で何かを計算する必要があるので。実際には、私が計算したいことは:http://stackoverflow.com/questions/39835689/unique-the-columns-and-get-the-frequencies-in-linuxです。その質問では、私は4行を使用しましたが、今は100行あり、3つの連続する行ごとにその質問として結果を得なければなりません。 – lightsnail

+1

なぜ私はbashに自分自身を制限するのかということを意味しました。これは非常に簡単な作業になる多くのスクリプト言語があります。 – mascoj

答えて

2

awkレスキュー!

入力ファイルの
$ awk 'NR>2{printf "%s", a2 ORS a1 ORS $0 ORS > FILENAME"."(++c)} 
      {a2=a1;a1=$0}' file 

$ cat file 
1 0 0 1 
1 1 0 1 
1 0 1 0 
1 0 1 0 
0 1 1 0 

あなたの計算を埋め込むことができ、これらの3

$ head file.{1..3} 
==> file.1 <== 
1 0 0 1 
1 1 0 1 
1 0 1 0 

==> file.2 <== 
1 1 0 1 
1 0 1 0 
1 0 1 0 

==> file.3 <== 
1 0 1 0 
1 0 1 0 
0 1 1 0 

を生成し、結果のみをスクリプトと出力されますが、あなたは上の任意の詳細を提供しませんでしたそれ。

説明

NR>2出発第三列
printf ...開始印刷最後の3行カウンタ接尾辞入力ファイル名に由来するファイルへ
> FILENAME"."(++c)

a2=a1;a1=$0更新最後の2行

ローリングウィンドウが小さい場合nこのスクリプトは、NR>(n-1)を変更し、最後の行を追跡してa(n-1)...a1に保存し、それに応じて印刷することで拡大縮小できます。 nが大きい場合は、配列(またはより良い円形配列)を使用する方がよい。

これは、おそらく最も一般的なバージョン...

$ awk -v n=3 'NR>n-1{fn=FILENAME"."c; 
        for(i=c+1;i<c+n;i++) printf "%s\n", a[(i-n)%n] > fn; 
        print > fn} 
        {a[(c++)%n]=$0}' file 
3

bashは、データ処理タスクのための素晴らしい選択肢ではありませんが、それは(遅いが)可能です:4バイナリ値列の

{ read row1 
    read row2 
    count=0 
    while read row3; do 
    # Do something with rows 1-3 
    { echo $row1 $row2 $row3; } > Row$((count+=1)).txt 
    # Slide the window 
    row1=$row2 
    row2=$row3 
    done 
} < hundred.txt 
+0

私はLinuxの初心者ですので、 'bash'メソッドしか考えられません。他の簡単なソリューション(' bash'以外)この問題は、ありがとう。 1 X 10^10行以上あります。 – lightsnail

2

百行も過言ではありません。一度にすべてを読んでください。データの量が大幅に大きくなった場合

mapfile -t rows < inputfile 
for r in "${!rows[@]}"; do # loop by row index 
    ((r >= 2)) || continue 
    # process "${rows[r-2]}" "${rows[r-1]}" and "${rows[r]}" 
    # into file Row$((r-1)) 
done 

は、あなたは本当に、このような+ numpyの(あなたのデータはバイナリ行列のように見えるため)Pythonなどの優れたツールを、使いたいです。

関連する問題