내용이 다음과 같은 파일이 있습니다.
2009 150 0 0 0 0000
75.316 0.0400390625 0.00007 0.00000 0.8980
76.216 0.0400390625 0.00007 1.00000 0.9046
77.217 0.0400390625 0.00009 2.00000 0.9113
78.341 0.0400390625 0.00010 3.00000 0.9183
2009 150 2 0 0 0000
75.316 0.0400390625 0.00007 0.00000 0.8980
76.216 0.0400390625 0.00007 1.00000 0.9046
77.217 0.0400390625 0.00009 2.00000 0.9113
78.341 0.0400390625 0.00010 3.00000 0.9183
79.616 0.0400390625 0.00013 4.00000 0.9255
제 생각에는:
- 키워드 2009로 시작하는 모든 줄을 찾습니다.
- 이 줄은 2009로 시작하는 다른 줄이 발견될 때까지 모든 후속 줄 앞에 추가되며, EOF까지 계속됩니다.
본질적으로 다음과 같은 출력을 찾고 있습니다.
2009 150 0 0 0 0000 75.316 0.0400390625 0.00007 0.00000 0.8980
2009 150 0 0 0 0000 76.216 0.0400390625 0.00007 1.00000 0.9046
2009 150 0 0 0 0000 77.217 0.0400390625 0.00009 2.00000 0.9113
2009 150 0 0 0 0000 78.341 0.0400390625 0.00010 3.00000 0.9183
2009 150 2 0 0 0000 75.316 0.0400390625 0.00007 0.00000 0.8980
2009 150 2 0 0 0000 76.216 0.0400390625 0.00007 1.00000 0.9046
.........
나는 오랫동안 이 문제에 대해 고민해 왔지만 해결책을 찾지 못했습니다. 어떤 도움이라도 대단히 감사하겠습니다. 플래그를 사용하여 키워드 사이의 텍스트를 추출하는 방법을 알고 있지만 이것이 올바른 방향인지 확실하지 않습니다.
답변1
다음을 위해 사용할 수 있습니다 awk
:
awk '/^2009/{a=$0;next}{print a" "$0} ' file.txt
이렇게 하면 2009가 처음 나타나기 전에 줄 앞에 공백이 추가됩니다. 다음과 같이 기본 문자열을 접두사로 설정할 수 있습니다.
awk 'BEGIN{a="My default prepend string";}/^2009/{a=$0;next}{print a" "$0} ' file.txt
답변2
나는 Perl에서 이것을 할 것이다:
perl -lne 'if(/^2009/){$n=$_; next} print "$n $_"' file
아니면 좀 더 간략하게
perl -lne '/^2009/ ? ($n=$_) : print "$n $_"' file
아이디어는 현재 행( Perl)을 로 시작하는 $_
것처럼 저장하고 , 그렇지 않은 경우 현재 행과 의 현재 값을 인쇄하는 것입니다 .$n
2009
$n
답변3
사용 sed
:
sed -n '
/^2009/ { h }
/^2009/ !{ G; s/^\(.*\)\n\(.*\)$/\2 \1/p }
' in_file
요청한 대로 설명하세요.
-n
sed
- 우리가 지시하지 않는 한 아무 것도 인쇄되지 않습니다 .
/^2009/ { h }
- 로 시작하는 라인에 도달하면 2009
이를 홀딩 버퍼에 넣습니다.
/^2009/ !{...}
- 로 시작하지 않는 모든 라인에 패턴이 {...}
적용됩니다 2009
.
G; s/^\(.*\)\n\(.*\)$/\2 \1/p
- 보유 버퍼를 복사하여 G
패턴 공간으로 방금 읽은 라인에 추가합니다. 이제 패턴 공간에 두 개의 라인이 있으므로 인쇄하기 전에 순서를 바꾸고 결합해야 합니다. 역참조를 사용한 대체 패턴이 바로 그런 일을 합니다.