100行の長さのファイルからランダムに10行を抽出したいと思います。まず、1から100(含む)の間の整数10個をランダムに生成します。
ind=$(shuf -i 1-100 -n 10 | sort -n)
sed
その後、この行(で示されている)を抽出しようとしますind
。そのため、ind
作成するには配列を再印刷する必要があります。
<ind(1)>p;<ind(2)>p;...;<ind(10)>p
良い
sed -n '<ind(1)>p;<ind(2)>p;...;<ind(10)>p' ~/orig.txt > ~/short.txt
どうすればいいですか?
答え1
あなたの例では、ind
配列ではなく文字列です。以下を使用する必要があります。
ind=($(shuf -i 1-100 -n 10 | sort -n))
配列で作成しますind
(配列はシェルでサポートされています(たとえばbash
、、、zsh
)ksh
)。
簡単です。次のことを試すことができます。
$ printf '%sp\n' $(shuf -i 1-100 -n 10 | sort -n) > /tmp/short.sed
$ sed -n -f /tmp/short.sed < orig.txt > short.txt
答え2
以下に基づくソリューションawk
(ソートは不要):
awk 'NR==FNR{a[$1];next} NR in a' <(shuf -i 1-100 -n 10) ~/orig.txt > ~/short.txt
そして純粋なGNUawk
バリアント(他の外部プロセスは必要ありません):
awk '
BEGIN { srand(); do a[int(100*rand()+1)]; while (length(a)<10) }
NR in a
' ~/orig.txt > ~/short.txt
答え3
長い道のりを行き、sed
ファイルから行を抽出するスクリプトを作成する代わりに、shuf
ファイルから直接使用してください。
shuf -n 10 ~/short.txt
元のファイルの順序で行を表示するには、次の手順を実行します。
cat -n ~/short.txt | shuf -n 10 | sort -n | cut -f 2-
これはファイルの行を列挙し、(ランダムな順序で)10行を抽出し、抽出された行を並べ替え、数字を削除します。
答え4
あなたはできます...
shuf -i 1-100 -n 10 | sort -n | sed 's/$/p;/' | sed -nf - orig.txt >short.txt
または、によると強く打つ
sed -nf <(sed 's/$/p;/' <(sort -n < <(shuf -i 1-100 -n 10))) <orig.txt >short.txt