2016-07-22 34 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

相關問題