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