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
그리고 순수한 GNU awk
변형(다른 외부 프로세스가 필요하지 않음):
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