n
이 라인 블록의 ath 라인에서 시작하여 각 라인의 라인을 가져오는 매우 간단한 방법(아마도 sed 라인을 사용하는 것입니까?)이 있습니까 ?n
m
더 구체적으로 말하면 수백만 줄의 파일이 있습니다. 4개 행마다 처음 2개 행을 가져오고 싶습니다.
하지만 다른 유사한 상황에서도 이렇게 하는 생각도 이해하고 싶습니다. 그래서 여기서는 좀 더 일반적인 질문을 드리고자 합니다.
답변1
~
GNU sed의 주소에서 사용할 수 있습니다:
sed -n '1~4p;2~4p'
"첫 번째 줄을 4줄마다 인쇄하고, 두 번째 줄을 4줄마다 인쇄합니다." 또는 "1줄부터 시작하고, 4줄마다 인쇄하고, 2줄에서 시작하고, 4줄마다 인쇄합니다."라고 되어 있습니다.
답변2
그리고 gnu split
:
n=2
m=4
split -l ${m} --filter="head -n ${n}" infile
i
번째 줄 이후 에만 이 작업을 수행하려면 이전 줄을 다음으로 리디렉션하면 됩니다 /dev/null
.
n=2
m=4
i=7
{ sed ${i}q >/dev/null; split -l ${m} --filter="head -n ${n}"; } <infile
gnu
도구에 액세스할 수 없는 경우 다음을 사용할 수 있습니다 awk
.
awk -v n=2 -v m=4 -v i=7 'NR<=i{next}; (NR-i)%m==1{c=1}; c++<=n' infile
답변3
GNU sed의 경우
sed '3~4,+1 d' file
또는 더 일반적으로:
m=4
n=2
sed "$((m-n+1))~$m,+$((m-n-1)) d" file
답변4
이것은 이식 가능하고 매우 간단한 솔루션입니다 sed
. ~
다른 많은 답변처럼 이식성이 없는 것을 사용하지 않습니다 . 단점은 다음을 sed
기반으로 코드를 작성 해야 한다는 것입니다.쌀그리고N, 쉽게 통과할 수 없습니다쌀그리고N매개변수로. 실제로 이 솔루션은 다음과 같은 경우에 효과적입니다.쌀그리고N미리 알고 작게 알아보세요.
~을 위한a=5,미터=4,n=2:
sed -n '5,$ {p;n;p;n;n;}'
어디
5
쉽게 말하면 그렇다.ㅏ;p;n;p
p
명령이 반복되는지 여부N시간,n
명령 포함(일반적으로:p;n;p;n;…;p;n;p
);n;n
n
명령이 반복되는지 여부망간횟수(일반적으로:n;n;n;…;n
).
출력 예:
$ seq 1 13 | sed -n '5,$ {p;n;p;n;n;}'
5
6
9
10
13
대용량 휴대용 솔루션이 필요한 경우쌀또는쌀또는N그걸 미리 모르면 그걸 이용하면 될 awk
것 같아요.