2012-05-26 21 views
1

我有兩個表格文件,我想合併,但在此之前我想減少第二個。如何用awk獲得給定分佈的隨機行?

的第一個文件假設文件1的表格,是這樣

A 67 98 56 
A 22 29 62 
A 11 99 28 
B 37 88 14 
B 33 99 65 

我們有3條線以A和兩個爲B

文件2包含A和B之間的3000行,我想隨機選擇文件2線,但相同數量的A和B的不是文件1,這意味着僅僅3個隨機線路用和兩個爲B

任何一個有關於如何使用awk做到這一點的想法?

感謝

回答

1
#!/bin/bash 
read -r acount bcount <<< $(csplit file2 '/^B /') 

awk -v "acount=$acount" -v "bcount=$bcount" ' 
    NR == FNR { 
     arr[$1]++; 
     next 
    } 
    ! setup { 
     setup = 1 
     while (arandcount < acount) { 
      line = int(rand() * acount) + 1 
      if (! alines[line]) { 
       alines[line] = 1 
       arandcount++ 
      } 
     } 
     while (brandcount < bcount) { 
      line = int(rand() * bcount) + 1 
      if (! blines[line]) { 
       blines[line] = 1 
       brandcount++ 
      } 
     } 
    } 
    FILENAME == "xx00" && FNR in alines { 
     print 
    } 
    FILENAME == "xx01" && FNR in blines { 
     print 
    }' file1 xx00 xx01 

其中, 「XX00」 和 「XX01」 是由csplit創建的文件的名稱。

csplit命令拆分對正則表達式的輸入文件,並輸出各輸出文件的行數。 read命令將這些計數放入變量中。這些變量傳遞給AWK程序。

第一個塊讀取file1中的所有行,並計算每一個「類型」(A或B)。

第二塊採行號通過選擇1之間和「類型」的行計數的隨機數進行選擇。由於該標誌,該塊僅被執行一次。

最後兩個塊檢查各行的記錄號,看它是否是挑行號的數組中,並打印它,如果它是。

0

這可能會爲你工作:

grep '^A' file2 | sort -R | head -$(grep -c '^A' file1) >file3 
grep '^B' file2 | sort -R | head -$(grep -c '^B' file1) >>file3 

注:這假定file1已排序。