在两列CSV中,我想检查连续的数字(值是整数(:
1,1
4,1
5,1
6,1
7,1
10,1
11,1
4,2
5,2
6,2
10,2
5,3
5,7
5,8
5,9
我试过了
awk -F, '
{
if($1==a+1) { n+=1 }
else { n = 1 }
{a=$1}
} {print $1"," n}
' file.txt
生产
1,1,1
4,1,1
5,1,2
6,1,3
7,1,4
10,1,1
11,1,2
4,2,1
5,2,2
6,2,3
10,2,1
5,3,1
5,7,1
5,8,1
5,9,1
其中,第三列计算相对于第一列的连续行。
- 我的方法是否正确(特别是在性能方面,因为它是一个大文件(? 根据第二列
- 计算第四列的最佳方法是什么(计算第二列中的连续值(?
这是包括第四列在内的预期输出。
1,1,1,1
4,1,1,1
5,1,2,1
6,1,3,1
7,1,4,1
10,1,1,1
11,1,2,1
4,2,1,1
5,2,2,1
6,2,3,1
10,2,1,1
5,3,1,1
5,7,1,1
5,8,1,2
5,9,1,3
我的想法是对生成的 3 列 CSV (sort -t, -k1,1n -k2,2n
( 进行排序,并对第二列执行相同的操作,但我不确定。
编辑:我在第一个数据集中犯了一个错误。当我们计算第一列时,第二列是常量,反之亦然。
这个awk
应该适合你:
awk 'BEGIN {
FS=OFS=","
}
{
$3 = ($1 == p1+1 ? $3+1 : 1)
$4 = ($1 == p1 && $2 == p2+1 ? $4+1 : 1)
}
{
p1 = $1
p2 = $2
} 1' file.csv
1,1,1,1
4,1,1,1
5,1,2,1
6,1,3,1
7,1,4,1
10,1,1,1
11,1,2,1
4,2,1,1
5,2,2,1
6,2,3,1
10,2,1,1
5,3,1,1
5,7,1,1
5,8,1,2
5,9,1,3
您能否尝试以下操作,在显示的示例上进行编写和测试(基本上以更笨拙的方式重新设计了 OP 的代码 :) ,感谢 OP 在评论中告知(。
awk '
BEGIN{
FS=OFS=","
}
{
count=$1-prev==1 && prev?++count:"1"
print $0,count
prev=$1
}
' Input_file
解释:
- 在这种方法中,我们没有重新分配当前行,而只是打印当前行的值以及计数值,这应该花费更少的时间。
输出将如下所示。
1,10,1
4,10,1
5,10,2
6,11,3
7,14,4
10,9,1
11,2,2
注意:如果您想在awk的计算后对输出进行排序,那么我们可以进一步使用| sort
对第3列恕我直言执行排序。