2017-06-13 74 views
0

我想從文件中選擇隨機行/單位,但單位由2行組成。從單位爲2行的文件中隨機選擇(單位)。

例如文件看起來像這樣

亞當
蘋果
柯以敏
糖果
史蒂夫
芯片
大衛
肉類
卡羅爾
胡蘿蔔

而且我要隨機子選擇讓說,2個單位

例如

亞當
蘋果
大衛
肉類

史蒂夫
芯片
卡羅爾
胡蘿蔔

我使用shufsort -R嘗試,但他們只混洗1線。請有人幫助我嗎? 謝謝。

+0

您希望能夠選擇多少個單位? –

+0

選擇第二行和第三行是可以接受的嗎? –

+0

您是否考慮過預處理數據,以便您只需隨機選擇單行,然後將所選行重新格式化爲每行兩行。 –

回答

2

您可以通過洗牌之前加入線(也可能不是一般的文件格式是一個壞主意,如果行描述一個單一的項目)與shuf做到這一點:

$ < file sed -e 'N;s/\n/:/' | shuf | head -1 | tr ':' '\n' 
Carol 
Carrots 

sed負荷一次兩行,並用冒號加入。

+0

你不需要p,只需刪除-n標誌。另外,如果你的sed支持'\ n',那麼你不需要-e,它接受作爲arg的文件名,所以你不需要'<'。它可以寫成'sed'N; s/\ n /:/'file' – 123

0

接在正確的範圍內的隨機數,確保它是奇數(如果需要的話),然後使用sed打印2行:

$ a=$(expr $RANDOM % \($(wc -l < input)/2 \) \* 2 + 1) 
$ sed -n -e ${a}p -e $((a+1))p input 
+0

你選擇'expr'到'$(())'或'(())'上的任何原因? – 123

+1

不,這只是我輸入的第一件東西。任何合理的人都會使用'a = $(($ RANDOM%($(wc -l <​​input)/ 2)* 2 + 1))' –

+1

那麼,任何合理的人可能會完全做一些其他的:)但這個工程。 –

0

而不是選擇線來打印,可以行走的文件並以特定概率打印每個「單元」。例如,要在文件中打印(大致)10%的「單位」,您可以執行以下操作:

awk 'BEGIN{srand()} NR%2 && (rand() < .1) {print; getline; print}' input 
+0

90%的時間都不會爲我打印任何東西。 – 123