在linux中每三个连续循环一次

时间:2016-10-03 18:01:30

标签: linux bash loops

我有一个包含100行的文件hundred.txt

例如:

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

我需要在每3连续行中操作一些计算,例如,我需要先使用Row1-Row3来进行计算:

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),我该如何解决这个问题?谢谢。

3 个答案:

答案 0 :(得分:3)

bash不是数据处理任务的绝佳选择,但它有可能(尽管很慢):

{ 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

答案 1 :(得分: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

如果数据量显着增加,您真的想要使用更好的工具,例如Python + numpy(因为您的数据看起来像二进制矩阵)。

答案 2 :(得分: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更新最后两行

如果您的滚动窗口很小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