如何通过awk检查CSV文件中的连续值?



在两列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. 我的方法是否正确(特别是在性能方面,因为它是一个大文件(?
  2. 根据第二列
  3. 计算第四列的最佳方法是什么(计算第二列中的连续值(?

这是包括第四列在内的预期输出。

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列恕我直言执行排序。

最新更新