我希望随机抽取 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