你可以...

你可以...

我希望随机抽取 10 行文件,该文件有 100 行长。首先,我随机生成 10 个 1 到 100(含)之间的整数

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成为数组(在 shell 中支持数组,如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

相关内容