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



我有一个数据集计算箱的出现次数,例如:

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 更适合这个?

编辑: 感谢卡拉法卡先生,添加的解决方案也将捕获第一行的数字。

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

我们可以将seqawk结合起来,使任务更容易:

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

使用 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

另一个awk

$ 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

最新更新