Text-Processing
如何隨機對文件進行子集化,然後從多個文件中選擇相同的行號
我有一個包含 3494 行的文件,我想從中隨機選擇 100 行,並將這些行寫入一個新文件。我可以這樣做:
shuf -n 100 input_file.txt output_file.txt
但是,我有很多這樣的輸入文件,我想從每個文件中選擇相同的 100 行。也就是說,我需要保留第一個選擇的行索引,
shuf
並在其他文件中選擇相同的行。我怎樣才能做到這一點?編輯:
第一個答案很有幫助,但我仍然無法從正確的文件中進行選擇。我有 10 個文件,我想從中選擇相同的 100 行。不知何故,我最終得到了 1100 行。
您可以先從 3494 中提取 100 個隨機數,然後從每個文件中提取這些行號,例如
seq 3494 | shuf -n 100 | awk 'NR==FNR{ z[$0]++;next} {if (FNR in z){ print >FILENAME"_random"}}' - ./*.txt
這將從每個文件中提取相同的行號並將它們保存到
FILENAME"_random"
您可以創建一個簡單的
sed
腳本文件來列印特定索引處的行,例如printf '%dp\n' $(shuf -i 1-3494 -n 100) > indexfile
然後像使用它
sed -nf indexfile File1 sed -nf indexfile File2 . .
等等。如果你有 GNU
sed
,-s, --separate
你可以使用順序從多個文件中選擇相同的行sed -snf indexfile File1 File2 File3
(
File1 File2 File3
如果你願意,可以用 shell glob 替換)。如果您想要一個在每次呼叫時選擇不同隨機子集的單行,那麼您可以執行類似的操作
printf '%dp\n' $(shuf -i 1-3494 -n 100) | sed -snf - File1 File2 File3