我有兩個表格文件,我想合併,但在此之前我想減少第二個。如何用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做到這一點的想法?
感謝
我有兩個表格文件,我想合併,但在此之前我想減少第二個。如何用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做到這一點的想法?
感謝
#!/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之間和「類型」的行計數的隨機數進行選擇。由於該標誌,該塊僅被執行一次。
最後兩個塊檢查各行的記錄號,看它是否是挑行號的數組中,並打印它,如果它是。
這可能會爲你工作:
grep '^A' file2 | sort -R | head -$(grep -c '^A' file1) >file3
grep '^B' file2 | sort -R | head -$(grep -c '^B' file1) >>file3
注:這假定file1
已排序。