파일 내용을 재정렬하여 각 레코드 "본문" 줄에 레코드 "제목" 줄을 추가합니다.

파일 내용을 재정렬하여 각 레코드 "본문" 줄에 레코드 "제목" 줄을 추가합니다.

누구든지 이것을 뒤집는 방법을 알고 있습니다.

FX_AM140_EML AM140
Backend/aa.java
Backend/bb.java
Backend/cc.java
Backend/dd.java
Backend/ee.java

FX_AM172_EML AM172
Backend/aa.java
Backend/bb.java

이에?

FX_AM140_EML AM140 Backend/aa.java
FX_AM140_EML AM140 Backend/bb.java
FX_AM140_EML AM140 Backend/cc.java
FX_AM140_EML AM140 Backend/dd.java
FX_AM140_EML AM140 Backend/ee.java
FX_AM172_EML AM172 Backend/aa.java
FX_AM172_EML AM172 Backend/bb.java

답변1

with 와 같은 것이 awk그 일을 할 것입니다:

awk '/^FX/ {a=$0;next} /^Backend/ {print a,$0}' <input file>

여기서는 헤더 줄이 다음으로 시작 FX하고 다른 줄은 다음으로 시작한다고 가정합니다.Backend

답변2

또 다른 awk접근 방식은 빈 줄로 구분된 줄 집합의 첫 번째 줄을 접두사로 처리합니다.

awk '
  $0 == ""     {prefix = ""; next}
  prefix == "" {prefix = $0; next}
               {print prefix, $0}'

답변3

펄 제안. 이 변형의 드라이버는 빈 줄로 구분된 줄 집합입니다.

perl -ne '
    BEGIN {$/ = "\n\n"}
    ($p, @a) = split("\n");
    print "$p $_\n" foreach @a;
' datafile

여러 줄로 작성하면 더 읽기 쉽지만 한 줄로 압축할 수 있습니다( 단락 모드도 전환하는 BEGINfor 절 -00을 바꿨습니다).

perl -00 -ne '($p, @a)=split("\n"); print "$p $_\n" foreach @a' datafile

이에 상응하는 내용 awk은 다음과 같습니다(간단한 연결을 통해 한 줄로 압축할 수도 있음).

awk -v RS= '
    {
        split($0, a, "\n");
        p=a[1]; delete a[1];
        for (f in a) {
            print p, a[f]
        }
    }
' datafile

레코드 구분 기호( RS)를 빈 문자열로 설정하면 단락 모드(POSIX을 검색한 다음 'RS가 비어 있는 경우")

산출

FX_AM140_EML AM140 Backend/aa.java
FX_AM140_EML AM140 Backend/bb.java
FX_AM140_EML AM140 Backend/cc.java
FX_AM140_EML AM140 Backend/dd.java
FX_AM140_EML AM140 Backend/ee.java
FX_AM172_EML AM172 Backend/aa.java
FX_AM172_EML AM172 Backend/bb.java

답변4

Perl 메소드는 이를 포함하지 않는 행을 /다른 행의 접두어로 사용합니다.

$ perl -lne 'if(/^(.[^\/]+)$/ || /^$/){ $k=$1; next} print "$k $_"' file
FX_AM140_EML AM140 Backend/aa.java
FX_AM140_EML AM140 Backend/bb.java
FX_AM140_EML AM140 Backend/cc.java
FX_AM140_EML AM140 Backend/dd.java
FX_AM140_EML AM140 Backend/ee.java
FX_AM172_EML AM172 Backend/aa.java
FX_AM172_EML AM172 Backend/bb.java

관련 정보