awk跳过记录。 getline命令

时间:2015-02-12 17:51:35

标签: bash ubuntu awk fibonacci

这是一项与使用斐波纳契二进制表示的数据压缩相关的任务。

我拥有的是这个文本文件:

的Result.txt

a 20
b 18
c 18
d 15
e 7

此文件是扫描文本文件并使用awk计算文件上每个字符的外观的结果。

现在我需要给每个char它的fibonacci二进制表示长度。 因为我是ubuntu和teminal的新手,我已经在java中完成了一个程序,它接收一个数字并打印所有斐波那契码字长度,直到数字并且它正在工作。 这正是我试图在这里做的。问题是它不起作用...... 斐波纳契码字的长度也可以作为斐波纳契。 这些是规则:

  • f(1)= 1 - 有1个长度为1的代码字。
  • f(2)= 1 - 有1个长度为2的代码字。
  • f(3)= 2 - 有2个长度为3的代码字。
  • f(4)= 3 - 有3个长度为4的代码字。

依旧...... (我在每个代码字上添加更多位,因此前两个长度将为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命令中存在问题。

非常感谢你!

1 个答案:

答案 0 :(得分:0)

在Google上搜索getlineawk,您最常找到完全避免获取线路的理由!通常情况下,这是一个标志,你并没有真正做过这样的事情&#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