m개의 행마다 n개의 행을 얻는 방법(n

m개의 행마다 n개의 행을 얻는 방법(n

n이 라인 블록의 ath 라인에서 시작하여 각 라인의 라인을 가져오는 매우 간단한 방법(아마도 sed 라인을 사용하는 것입니까?)이 있습니까 ?nm

더 구체적으로 말하면 수백만 줄의 파일이 있습니다. 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;pp명령이 반복되는지 여부N시간, n명령 포함(일반적으로: p;n;p;n;…;p;n;p);
  • n;nn명령이 반복되는지 여부망간횟수(일반적으로: n;n;n;…;n).

출력 예:

$ seq 1 13 | sed -n '5,$ {p;n;p;n;n;}'
5
6
9
10
13

대용량 휴대용 솔루션이 필요한 경우또는또는N그걸 미리 모르면 그걸 이용하면 될 awk것 같아요.

관련 정보