데이터 행 앞에 머리글 행을 추가하여 텍스트 파일을 다시 정렬합니다.

데이터 행 앞에 머리글 행을 추가하여 텍스트 파일을 다시 정렬합니다.

내용이 다음과 같은 파일이 있습니다.

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

제 생각에는:

  1. 키워드 2009로 시작하는 모든 줄을 찾습니다.
  2. 이 줄은 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)을 로 시작하는 $_것처럼 저장하고 , 그렇지 않은 경우 현재 행과 의 현재 값을 인쇄하는 것입니다 .$n2009$n

답변3

사용 sed:

sed -n '
  /^2009/ { h }
  /^2009/ !{ G; s/^\(.*\)\n\(.*\)$/\2 \1/p }
  ' in_file

요청한 대로 설명하세요.

-nsed- 우리가 지시하지 않는 한 아무 것도 인쇄되지 않습니다 .

/^2009/ { h }- 로 시작하는 라인에 도달하면 2009이를 홀딩 버퍼에 넣습니다.

/^2009/ !{...}- 로 시작하지 않는 모든 라인에 패턴이 {...}적용됩니다 2009.

G; s/^\(.*\)\n\(.*\)$/\2 \1/p- 보유 버퍼를 복사하여 G패턴 공간으로 방금 읽은 라인에 추가합니다. 이제 패턴 공간에 두 개의 라인이 있으므로 인쇄하기 전에 순서를 바꾸고 결합해야 합니다. 역참조를 사용한 대체 패턴이 바로 그런 일을 합니다.

관련 정보