2016-07-22 50 views
0

我想用awk/python比较大文件(〜1GB)中的连续行(因为我使用大文件,所以我宁愿使用awk)命令。下面是输入和输出的一个例子:比较awk /(或python)中的连续行并随机选择一个重复行

输入文件

#x y 
1 11  # Remarks (not part of the input file) 
10 12  # (Remark *1) 
10 17  # 
4 14 
20 15  # (Remark *2) 
20 16  # 
20 17  # 
20 22  # 
5 19 
10 20 

(备注* 1):由于该行和连续列/行的x值的x值是相同的,应该在输出文件中打印该行或下一行(RANDOM选择)

(备注* 2):由于此行的x值和接下来3行的x值相同,因此此行行或接下来的3行中的一行(RANDOM选择)应打印在输出文件中

我想有输出文件是这样的:

#x y 
1 11 
10 17 
4 14 
20 17 
5 19 
10 20 

或(因为随机选择,如果相同的x值出现在连续的行)

#x y 
1 11 
10 12 
4 14 
20 16 
5 19 
10 20 

基本上我想如果X-比较当前行/行的值与下一个连续行/行的x值相同。 如果不是,则应打印当前行。 如果是,只有一个随机行应选择具有相同x值的连续行/行(y值对比较不重要)。

我希望有人能帮助我!

+0

看起来像油藏采样的应用。 –

+0

是的,感谢您的关键字!由于我是awk新手,我希望获得更多帮助。 – AwkUser

回答

2
$ cat tst.awk 
function prtBuf(  idx) { 
    if (cnt > 0) { 
     idx = int((rand() * cnt) + 1) 
     print buf[idx] 
    } 
    cnt = 0 
} 

BEGIN { srand() } 
$1 != prev { prtBuf() } 
{ buf[++cnt]=$0; prev=$1 } 
END { prtBuf() } 

$ awk -f tst.awk file 
1 11  # Remarks (not part of the input file) 
10 17  # 
4 14 
20 17  # 
5 19 
10 20 

$ awk -f tst.awk file 
1 11  # Remarks (not part of the input file) 
10 12  # (Remark *1) 
4 14 
20 22  # 
5 19 
10 20 

我认为从例如xy列标题实际上不是输入文件的一部分,因此把他们赶走。如果它们确实存在,并且您希望它们在输出中,那么只需在前面添加一条NR==1{print;next}

+1

伟大的工作! :) 非常感谢你!!! – AwkUser

相关问题