여기에서 사용할 수 있는 몇 가지 이전 질문을 찾으려고 노력했지만 불행히도 정확한 사례를 찾을 수 없었습니다.
다른 명령의 출력에서 다음과 같은 결과를 얻고 싶습니다.
pattern.d
17.91
17.55
pattern.b
pattern.a
7.21
9.34
pattern.c
이와 관련하여:
pattern.d
17.91
17.55
pattern.b
1000
pattern.a
7.21
9.34
pattern.c
1000
좀 더 설명하려고 합니다. "pattern"이라는 문자열을 포함하는 각 줄 뒤에는 항상 숫자가 있어야 합니다. 그렇지 않은 경우 값이 1000인 새 행을 삽입하고 싶습니다.
패턴에는 나중에 내용을 알파벳순으로 정렬하는 데 도움이 되는 변경되는 "확장자"(.a .b .c .d이지만 "확장자"의 숫자는 없음)가 있습니다.
편집: 답변을 수락했지만 여전히 다른 변형을 찾고 싶은 사람이 있으면 "패턴"이 다르게 나타나도록 지정해야 하며 다음과 같이 연속해서 2~3개 이상이 있을 수 있습니다.
pattern.a
pattern.d
pattern.c
pattern.d
pattern.b
17.91
답변1
다음은 sed
모든 입력(예: 여러 개의 연속된 일치 항목 pattern
)에 대해 작동하는 솔루션입니다.
sed '1{ # when on first line
x # exchange
s/^/1000/ # replace the empty hold buffer with "1000"
x # exchange back
}
: do # label "do"
/pattern/{ # if the current line matches "pattern"
${ # if we're on the last line
G # append hold buffer content to pattern space
b # go to end of script
}
n # otherwise print and pull in the next line
/^[[:digit:]]/!{ # if this one doesn't start with a digit
x # exchange
p # print (the pattern space is now "1000")
x # exchange back
b do # go to label "do"
}
}' infile
그것으로 gnu sed
우리는 쓸 수 있습니다
sed '1{x;s/^/1000/;x};:b;/pattern/{${G;b};n;/^[[:digit:]]/!{x;p;x;bb}}' infile
다음과 같이 할 수 있습니다 awk
:
awk -vc=0 '!/^[[:digit:]]/{
if (c) {print "1000"}
}
{ if (/pattern/){c=1} else{c=0}
}
END{if (c){print "1000"}
};1' infile
즉, c=1
일치하는 줄에 설정하고 pattern
, c=0
나머지 줄에 설정하고, 숫자로 시작하지 않는 모든 줄에 설정하고(블록에서 END
) c
이미 설정되어 있는지(또는 1
이전 줄이 일치함을 의미 pattern
) 확인합니다. print 이면 1000
.
답변2
sed -e '
$!{
/pattern\.[a-z]/N
/\n/!b
/\n[+-]\{0,1\}[.][0-9]\{1,\}$/b
/\n[+-]\{0,1\}[0-9]\{1,\}\([.][0-9]*\)\{0,1\}$/b
h;s/\(.*\n\).*/\11000/p
g;D
}
/pattern\.[a-z]/a\
1000
' yourfile
결과
pattern.d
17.91
17.55
pattern.b
1000
pattern.a
7.21
9.34
pattern.c
1000
피복재
- 비록 eof 시점은 아니지만
$!{...}
현재 라인이 관심 라인이라면 패턴 공간에 다음 라인을 추가합니다. - 그런 다음 다음과 같은 경우 추가 처리를 건너뜁니다. a) 개행을 찾을 수 없음 => 현재 줄에 패턴이 없습니다. b) 두 번째 줄에는 .nnn 형식의 부동 소수점 숫자입니다. c) mmm, mmm 또는 mmm.nnn 형식의 부동 소수점 숫자는 두 번째 줄에만 나타납니다. d) 가능성을 배제하십시오 => 개행 문자 다음 줄의 끝에 매직 넘버 1000을 추가해야 합니다.
답변3
if 의 연속 인스턴스는 2개 이상 없으며 pattern
GNU sed가 있는 경우:
sed '/^pattern/ {$!N; /\n[0-9]/b; s/$/\n1000/M}' file
pattern.d
17.91
17.55
pattern.b
1000
pattern.a
7.21
9.34
pattern.c
1000
작동 방식:
- 현재 줄이
pattern
then으로 시작하는 경우- EOF가 아닌 경우 다음 줄을 추가합니다.
- 줄 바꿈 뒤에 숫자가 있으면(더 구체적일 수 있음)
b
종료합니다(즉, 다음 줄로 계속). - 끝나는 첫 번째 줄을 개행 문자로 바꾸고
1000
GNU 특정 M
수정자는 $
일치 또는 "일반" 사례와 EOF 사례를 처리 \n
하도록 허용합니다 $
(다음 줄은 추가되지 않음).
답변4
앗해결책:
awk '{ if ($0 ~ /pattern/) { # if it's a `pattern` line
if ((getline nl) > 0) { # check if next record exists
# if next record hasn't number - insert `1000`, otherwise - print current and next records as they are
print ((nl !~ /^[0-9]/)? $0 ORS 1000 ORS nl: $0 ORS nl)
} else {
print $0 ORS 1000 # if the file ends up with pattern - insert `1000`
}
} else {
print $0 # print other record
}
}' file
산출:
pattern.d
17.91
17.55
pattern.b
1000
pattern.a
7.21
9.34
pattern.c
1000