あなたはできます...

あなたはできます...

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、、、zshksh)。

簡単です。次のことを試すことができます。

$ 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

関連情報