这是一项与使用斐波纳契二进制表示的数据压缩相关的任务。
我拥有的是这个文本文件:
的Result.txt
a 20
b 18
c 18
d 15
e 7
此文件是扫描文本文件并使用awk计算文件上每个字符的外观的结果。
现在我需要给每个char它的fibonacci二进制表示长度。 因为我是ubuntu和teminal的新手,我已经在java中完成了一个程序,它接收一个数字并打印所有斐波那契码字长度,直到数字并且它正在工作。 这正是我试图在这里做的。问题是它不起作用...... 斐波纳契码字的长度也可以作为斐波纳契。 这些是规则:
依旧...... (我在每个代码字上添加更多位,因此前两个长度将为2和3)
这是我所制作的代码:它的名字是scr5
{
a=1;
b=1;
len=2
print $1 , $2, len;
getline;
print $1 ,$2, len+1;
getline;
len=4;
for(i=1; i< num; i++){
c= a+b;
g=c;
while (c >= 1){
print $1 ,$2, len ;
if (getline<=0){
print "EOF"
exit;
}
c--;
i++;
}
a=b;
b=c;
len++;
}}
现在我在终端上写道:
n=5
awk -v num=$n -f scr5 a
有两个问题: 1.它跳过第三个字母c。 2.在第四个字母d上,它打印第一个字母的长度,2,而不是长度为3。
我猜在getline命令中存在问题。
非常感谢你!答案 0 :(得分:0)
在Google上搜索getline
和awk
,您最常找到完全避免获取线路的理由!通常情况下,这是一个标志,你并没有真正做过这样的事情&#34; awk&#34;办法。查找awk教程并完成基础知识,我确信您很快就会看到为什么尝试使用getlines并没有让您朝着正确的方向前进。
在下面的脚本中,BEGIN
块在读取任何输入之前在开始处运行一次,然后对于每行输入自动运行下一个块 - 不需要getline。
$ cat fib.awk
BEGIN { prior_count = 0; count = 1; len = 1; remaining = count; }
{
if (remaining == 0) {
temp = count;
count += prior_count;
prior_count = temp;
remaining = count;
++len;
}
print $1, $2, len;
--remaining;
}
$ cat fib.txt
a 20
b 18
c 18
d 15
e 7
f 0
g 0
h 0
i 0
j 0
k 0
l 0
m 0
$ awk -f fib.awk fib.txt
a 20 1
b 18 2
c 18 3
d 15 3
e 7 4
f 0 4
g 0 4
h 0 5
i 0 5
j 0 5
k 0 5
l 0 5
m 0 6