로에게 sed
당신이 할 수 있습니다 :
sed '24q;1,5d;12,18d' <infile >outfile
... 아마도 더 효율적인 솔루션이있을 수 있습니다 head
. Don은 이미 그 방법이 잘 작동하는 방법을 이미 보여 주었지만, 나는 그것도 가지고 놀았습니다. 이 특정한 경우를 처리하기 위해 할 수있는 일 :
for n in 5 6 7 6
do head -n"$n" >&"$((1+n%2))"
done <infile >outfile 2>/dev/null
... 반복의 값 이 짝수인지 홀수 인지 에 따라 head
4 번이나 호출 합니다 .outfile
/dev/null
$n
더 일반적인 경우에는 이미 가지고있는 다른 것들과 함께 이것을 조롱했습니다.
somehead()(
### call it like:
### somehead -[repeat] [-][numlines]* <infile >outfile
set -e -- "${1#-}" "$@" #-e for arg validation
r=; cd -- "${TMP:-/tmp}" #go to tmp
dd bs=4096 of="$$$$" <&4 2>&3 & #dd <in >tmpfile &bg
until [ -s "$$$$" ]; do :; done #wait while tmpfile empty
exec <"$$$$" 4<&-; rm "$$$$" #<tmpfile; rm tmpfile
[ "$3${1}0" -ne "$3${2#?}0" ] || #validate args - chk $1
shift "$(((r=-${1:--1})||1))"; shift #shift 1||2
while [ "$(((r+=(_n=1))-1))" -ne 0 ] && #while ! $rptmax &&
IFS= read -r l && # ! EOF &&
printf "%.$(($1>0?${#l}+1:0))s" "$l # ? printf do
"; do for n do [ "${n#-}" -gt 0 ] || exit #args all -[nums>0]
head "-n$((${n#-}-_n))" >&"$((n>(_n=0)?1:3))" #head -n?$1 >?[+-]
done; done #done and done
) 4<&0 3>/dev/null #4<for dd 3>for head
이것은 다음과 같은 일을 할 수 있습니다.
seq 100 | somehead -1 -5 6 -7 6
... 인쇄 ...
6
7
8
9
10
11
19
20
21
22
23
24
첫 번째 인수는 접두사로 시작하는 반복 횟수 -
, 또는 실패한 경우에만 a -
입니다. 카운트가 제공되면 지정된 횟수만큼 다음 args에 주어진 라인 패턴을 반복하고 그렇게되면 중지합니다.
다음에 나오는 각 인수에 대해 기록해야하는 행 수를 나타 내기 위해 음의 정수를 해석하고에 기록되어야 /dev/null
하는 행 수를 나타 내기 위해 양의 정수를 해석합니다 stdout
.
따라서 위의 예에서는 처음 5 행을 /dev/null
다음에 6 stdout
, 다음 7을 /dev/null
다시, 다음 6을 다시 한 번에 인쇄합니다 stdout
. 마지막 인수에 도달하고 -1
반복 횟수를 완전히 순환 하면 종료됩니다. 첫 번째 인수가 -2
있었다면 프로세스를 한 번 더 반복했거나 -
가능한 한 오랫동안 진행했을 것입니다.
각 인수주기마다 while
루프가 한 번 처리됩니다. 각 루프의 맨 위에서 첫 번째 줄부터 stdin
쉘 변수를 읽습니다 $l
. 이것은 while head </dev/null; do :; done
무한정 반복 되기 때문에 필요 head
합니다. 파일 끝에 도달하면 리턴으로 표시합니다. EOF에 대한 확인을하기 위해 최선을 다하고 있습니다 있도록 read
하고 printf
기록합니다 $l
에 플러스 바꿈을 stdout
두 번째 인수는 양의 정수 경우에만.
이 read
검사는 다른 루프가 호출 된 직후에 루프를 약간 복잡하게 만듭니다. 루프 는 상위 루프 의 각 반복 에 대해 표시된대로 for
args 2-$#
를 $n
반복 while
합니다. 즉, 각 반복에 대해 첫 번째 arg는 명령 행에 지정된 값에서 하나씩 감소해야하지만 다른 모든 값은 원래 값을 유지해야하므로 $_n
마커 var의 값을 각 값에서 빼야합니다. 첫 번째 인수의 값이 0보다 큽니다.
이는 함수의 주요 루프를 구성하지만 대부분의 코드는 맨 위에 있으며 함수를 파이프로 입력으로 깔끔하게 버퍼링 할 수 있도록 고안되었습니다. 이것은 먼저 backgrounded dd
를 호출하여 블록 크기가 4k 인 출력에서 tmpfile에 복사합니다. 그런 다음 함수는 홀드 루프를 설정합니다. 단일 루프에서도 거의 완료되지 않아야 dd
합니다. 함수보다 먼저 파일에 단일 쓰기를 한 다음 stdin을 tmpfile에 연결된 파일 설명 자로 바꿉니다. 그 후 즉시 파일을 연결 해제합니다rm
. 이것은 함수가 트랩을 요구하지 않고 또는 정리를 위해 스트림을 안정적으로 처리 할 수있게합니다. 함수가 fd에서 클레임을 해제하자마자 명명 된 파일 시스템 링크 만 이미 제거되었으므로 tmpfile의 존재가 중지됩니다.
head
하고tail
있습니까? 그렇다면 귀하의 솔루션은 귀하가 할 수있는 최선의 방법입니다. 다른 프로그램을 사용할 수sed
있거나awk
더 나은 솔루션을 허용 할 수있는 경우 (예 : 프로세스 호출 횟수 감소)