awk 跳过记录。 getline命令
awk skipping records. getline command
这是一项与使用斐波那契二进制表示的数据压缩相关的任务。
我有这个文本文件:
result.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 , , len;
getline;
print ,, len+1;
getline;
len=4;
for(i=1; i< num; i++){
c= a+b;
g=c;
while (c >= 1){
print ,, 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 中搜索 getline
和 awk
,您通常会找到完全避免使用 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 , , 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
这是一项与使用斐波那契二进制表示的数据压缩相关的任务。
我有这个文本文件:
result.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 , , len;
getline;
print ,, len+1;
getline;
len=4;
for(i=1; i< num; i++){
c= a+b;
g=c;
while (c >= 1){
print ,, 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 中搜索 getline
和 awk
,您通常会找到完全避免使用 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 , , 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