sed 또는 awk를 통해 세 줄 그룹의 첫 번째, 세 번째, 다섯 번째 줄을 추출하는 방법은 무엇입니까?

sed 또는 awk를 통해 세 줄 그룹의 첫 번째, 세 번째, 다섯 번째 줄을 추출하는 방법은 무엇입니까?

파일이 있다고 가정해 보겠습니다.

Line1
Line2
Line3
Line4
Line5 
Line6
Line7 
Line8 
Line9
Line10
Line11
Line12

난 갖길 원해:

Line1
Line2
Line3
Line7 
Line8 
Line9
Line13
Line14
Line15

즉, 세 행(포함)의 홀수를 원합니다.

나는 다음과 같은 몇 가지 아이디어를 가지고 있습니다.for (i=1, i<=FR, i+5), {sed -n,'i, i+1p' } < input

sed의 for 루프 구조를 알려주실 수 있나요? 이 문제를 해결하는 방법은 무엇입니까?

답변1

이 시도

awk 'NR % 6 == 1 || NR % 6 == 2 || NR % 6 == 3' filename.txt > output.txt

답변2

seq 20|
sed 'n;n;n;$!N;$!N;d'

n현재 라인을 추가 입력 라인으로 덮어쓰고 n그것이 포함하는 패턴 공간을 인쇄합니다.(이렇게 하지 않는 sed -nsed -e'#n'), 그래서 우리는 이 작업을 세 번 수행한 다음 두 개의 추가 입력 라인을 버퍼링하고 d많은 것을 삭제합니다.

1
2
3
7
8
9
13
14
15
19
20

내가 가진 또 다른 것은 이것입니다:

sed -ne:p -e'$p;N;s/\n/&/2p;tn' -ebp \
     -e:n -en \
     -e:d -e'N;s/\n/&/2;t'      -ebd

N먼저 두 개의 추가 외부 입력 라인을 버퍼링 하고 \n추가된 ewline을 계산하고, 현재 라인이 마지막 라인이거나 버퍼가 가득 찼는지 인쇄한 다음 해당 라인을 삭제하기 전에 해당 라인을 외부 입력 라인으로 덮어씁니다 n. 두 라인을 더 버퍼링합니다.

다음과 같이 작성할 수도 있습니다.

sed -ne:p -e'$p;N;s/\n/&/2p;tn' \
     -ebp -e:n -e'n;n;n'

하지만 ests의 장점 t은 다음과 같이 쉽게 매개변수화할 수 있다는 것입니다.

altl(){ sed -ne":t$(n=0 nt='\n\t' b=$nt\b
        while   [ "$#" -gt "$((!(n+=1)))" ]  &&
                c=${1%?}        p=${1##*[!p]} \
                l=$nt${p:+\$p;} p=$nt$p${p:+;}n
        do      case    $1      in
                (''|0*|*[!0-9]*?|*[!pd])
                   >&2  printf '"%s":\tARG ERR\n' "$1"
                        kill -2 0;;
                (1?|?|$((c-=1))) ! :; esac         &&
                printf  "\n:$n.0${l}N;%s$c;t$n.1%b" \
                        's/\n/&/' "$b$n.0\n:$n.1"
                shift;  printf %b "$p${1+\c}${nt}bt"
        done)"
}

사실, 다른 것을 만드는 것도 특별히 어렵지 않습니다. 한 번에 너무 많은 을 인쇄하면 [Nn]됩니다 sed. 그래서 아마도 나는 위의 글을 쓰는 데 시간을 낭비하고 있었을 것입니다. 하지만 작동합니다.

(   set -x
    seq 150 |
    altl p 40d p p 10d 5p
)

### This is the sed script the function's shell loop writes.
### We see it because I enabled -xtrace output on stderr.

:t
    p;n
:2.0
    N;s/\n/&/39;t2.1
    b2.0
:2.1
    n
    p;n
    p;n
:5.0
    N;s/\n/&/9;t5.1
    b5.0
:5.1
    n
:6.0
    $p;N;s/\n/&/4;t6.1
    b6.0
:6.1
    p;n
    bt

### This ends the sed script.
### The rest is sed's stdout.

1
42
43
54
55
56
57
58
59
100
101
112
113
114
115
116
117

관련 정보