繁体   English   中英

awk 跳过记录。 获取线命令

[英]awk skipping records. getline command

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

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

结果.txt

a 20
b 18
c 18
d 15
e 7

该文件是扫描文本文件并使用 awk 计算文件中每个字符的出现次数的结果。

现在我需要给每个字符它的斐波那契二进制表示长度。 因为我是 ubuntu 和终端的新手,所以我在 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 命令有问题。

非常感谢!

在 Google 上搜索getlineawk ,您会找到完全避免使用 getline 的理由! 通常这表明你并没有真正以“awk”的方式做事。 查找 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

上述解决方案,压缩形式:

mawk 'BEGIN{ ___= __=  _^=____=+_  }  !_ { __+=(\
            ____=___+_*(_=___+=____))^!_ } $++NF = (_--<_)+__' 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM