당신은 할 수 있습니다 ...

당신은 할 수 있습니다 ...

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

관련 정보