【问题标题】:Loop every three consecutive rows in linux在linux中每连续三行循环一次
【发布时间】:2016-10-03 18:01:30
【问题描述】:

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

【问题讨论】:

  • 只是好奇。为什么要为此而抨击?
  • @mascoj 因为我需要在每 3 个连续行中计算一些东西。实际上,我要计算的是:stackoverflow.com/questions/39835689/…。在那个问题中,我使用了 4 行,但现在我有 100 行,每连续 3 行必须得到一个结果作为那个问题。
  • 我的意思更多的是为什么要限制自己使用 bash。在许多脚本语言中,这将是一项极其简单的任务。
  • 是的,使用带有库的语言来处理二进制矩阵……

标签: linux bash loops


【解决方案1】:

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

【讨论】:

  • 我是Linux的初学者,所以只能想出bash的方法,你能帮我解决这个问题的其他快速解决方案(bash除外)吗,谢谢。比如说,我有 1 X 10^10 行或更多。
【解决方案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&gt;2 开始第三行
printf ... 开始打印最后 3 行
&gt; FILENAME"."(++c) 到从带有计数器后缀的输入文件名派生的文件

a2=a1;a1=$0更新最后两行

如果您的滚动窗口很小n,您可以通过更改NR&gt;(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】:

    一百行四个二进制值列并不算多;一口气读完。

    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(因为你的数据看起来像二进制矩阵)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      • 2017-09-05
      • 2013-12-07
      • 2013-04-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多