Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 为datatable中缺少的值添加带0的行_Bash_Unix_Awk_Datatable - Fatal编程技术网

Bash 为datatable中缺少的值添加带0的行

Bash 为datatable中缺少的值添加带0的行,bash,unix,awk,datatable,Bash,Unix,Awk,Datatable,我有一个数据集来计算箱子的发生率,例如: 1 10 2 15 3 1 5 50 8 990 正如你所看到的,我在第一列中缺少垃圾箱。当我想要绘制这些数据时,我正在寻找一种方法来添加那些缺失的值,在第二列上使用0,例如,如果我知道我的箱子上升到10: 1 10 2 15 3 1 4 0 5 50 6 0 7 0 8 990 9 0 10 0 我正在寻找一个unix/bash解决方案,因为它适合我的管道,而且我的文件相当大,但也许R更适合这个?编辑:多亏了Karafka先生,添加的解决方案也将

我有一个数据集来计算箱子的发生率,例如:

1 10
2 15
3 1
5 50
8 990
正如你所看到的,我在第一列中缺少垃圾箱。当我想要绘制这些数据时,我正在寻找一种方法来添加那些缺失的值,在第二列上使用0,例如,如果我知道我的箱子上升到10:

1 10
2 15 
3 1
4 0
5 50
6 0
7 0
8 990
9 0
10 0
我正在寻找一个unix/bash解决方案,因为它适合我的管道,而且我的文件相当大,但也许R更适合这个?

编辑:多亏了Karafka先生,添加的解决方案也将捕获第一行的数字

awk -v value=10 '$1-prev>1{while(++prev<$1){print prev,"0"}} {prev=$1;print} END{if(prev<value){while(prev<=value){print prev,"0";prev++}}}'  Input_file
然后在运行上述代码之后,我们将得到以下输出

1 0
2 0
3 10
4 15
5 0
6 0
7 1
8 0
9 50
10 0
11 0
12 0
13 0
14 0
15 0
16 0
17 0
18 0
19 990
你能试试下面的吗

awk -v value=10 'prev && $1-prev>1{while(++prev<$1){print prev,"0"}} {prev=$1;print} END{if(prev<value){while(prev<=value){print prev,"0";prev++}}}' Input_file
现在也添加了一个非线性的解决方案

awk -v value=10 '
prev && $1-prev>1{
  while(++prev<$1){
    print prev,"0"
  }
}
{
  prev=$1
  print
}
END{
  if(prev<value){
    while(prev<=value){
      print prev,"0"
      prev++
    }
  }
}'  Input_file
使用Bash和join:

我们可以将seq和awk结合起来,使任务更简单:

awk 'NR==FNR{a[$1]=$0;next}{print $1 in a?a[$1]:$1 FS 0}' file <(seq 10)
您也可以这样做:

 awk 'NR==FNR{a[$1]=$0;next}{print $1 in a?a[$1]:$0}' f <(seq -f '%g 0' 10)
使用您的数据进行测试:

kent$  cat f
1 10
2 15
3 1
5 50
8 990

kent$  awk 'NR==FNR{a[$1]=$0;next}{print $1 in a?a[$1]:$1 FS 0}' f <(seq 10)
1 10
2 15
3 1
4 0
5 50
6 0
7 0
8 990
9 0
10 0
另一个awk


如果丢失,这也将填充第一个记录。

对于我的可复制示例以及真实数据,它显然可以正常工作。谢谢如果缺少,这将错过填写第一条记录的机会。@karakfa,谢谢您,先生,我现在添加了编辑解决方案,该解决方案应该也适用于第一行的缺失,如果这里遗漏了任何内容,请务必让我知道,再次感谢。@RavinderSingh13只是做了我的一部分,先生。这也是我所做的。你可能想要seq 10而不是echo process sub.@glennjackman是的,这是一个快速的黑客攻击,弊大于利。Ed,你是一个老会员,你知道在答案上添加解释会增加它的价值:@Ibo不,有时它会降低它的价值。向普通脚本添加解释与向执行i++的代码添加增量i注释一样有用。任何读到这篇文章而不理解它的人,在awk手册页中查找结构会得到比我解释的多得多的东西。。。是一个循环等等。
$ awk '{n[$1]=$2} END{for (i=1;i<=10;i++) print i,n[i]+0}' file
1 10
2 15
3 1
4 0
5 50
6 0
7 0
8 990
9 0
10 0
 awk 'NR==FNR{a[$1]=$0;next}{print $1 in a?a[$1]:$0}' f <(seq -f '%g 0' 10)
kent$  cat f
1 10
2 15
3 1
5 50
8 990

kent$  awk 'NR==FNR{a[$1]=$0;next}{print $1 in a?a[$1]:$1 FS 0}' f <(seq 10)
1 10
2 15
3 1
4 0
5 50
6 0
7 0
8 990
9 0
10 0
$ awk -v mx=10 '{while(++k<$1) print k,0}1; 
            END {while(k++<mx) print k,0}' file
$ awk '{n[$1]=$2} END{for (i=1;i<=10;i++) print i,n[i]+0}' file
1 10
2 15
3 1
4 0
5 50
6 0
7 0
8 990
9 0
10 0