Text-Processing

如何隨機對文件進行子集化,然後從多個文件中選擇相同的行號

  • March 3, 2017

我有一個包含 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

引用自:https://unix.stackexchange.com/questions/348743