为数据表中的缺失值添加带有0的行

时间:2018-09-17 11:04:30

标签: 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更适合这个吗?

5 个答案:

答案 0 :(得分:4)

编辑: :感谢karafaka先生,添加了也可以捕获第一行数字的解决方案。

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

让我们说以下是Input_file:

cat Input_file
3 10
4 15
7 1
9 50
19 990

然后,在运行以上代码之后,我们将获得以下输出。

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

答案 1 :(得分:4)

使用Bash和join

$ join -a 1 --nocheck-order -e 0 -o 1.1,2.2 <(seq 10) file

输出:

1 10
2 15
3 1
4 0
5 50
6 0
7 0
8 990
9 0
10 0

答案 2 :(得分:4)

我们可以结合使用@EnableJpaRepositories (value = "com.encashment.repository")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)

答案 3 :(得分:2)

另一个awk

$ awk -v mx=10 '{while(++k<$1) print k,0}1; 
            END {while(k++<mx) print k,0}' file

如果缺少的话,这将填充第一条记录。

答案 4 :(得分:0)

$ 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