각 출력 줄이 블록 제목으로 시작하도록 텍스트를 어떻게 변환할 수 있습니까?

각 출력 줄이 블록 제목으로 시작하도록 텍스트를 어떻게 변환할 수 있습니까?

다음을 변환하려면 스크립트를 작성해야 합니다.

Name = x:y
Z =  a:b.c
Z1 = a1:b1.c1
End
Name=x1:y1
Z2 = a2:b2.c2
Z3 = a3:b3.c3
Z4 = a4:b4.c4
End
Name = l:k
s = w:e.v
End

입력하다:

x:y Z    a:b.c
x:y Z1   a1:b1.c1
x1:y1   Z2   a2:b2.c2
x1:y1   Z3   a3:b3.c3
x1:y1   Z4   a4:b4.c4
l:k s    w:e.v

답변1

=선택적 주변 공백을 구분 기호로 사용합니다 .

awk -F '[[:blank:]]*=[[:blank:]]*' '
    $1 == "Name" {name = $2; next}
    $1 != "End"  {print name, $1, $2}
' filename

이러한 솔루션을 살펴보면 awk진행 상황이 약간 혼란스럽다는 것을 알 수 있습니다. 잘 배치된 인쇄 문을 삽입하면 무슨 일이 일어나고 있는지 시각적으로 볼 수 있습니다.

$ awk -F '[[:blank:]]*=[[:blank:]]*' '
      $1 == "Name" { name = $2; print "--NAME: "$2; next }; 
      $1 != "End" { print " --END: "name,$1,$2 }
' sample.txt

다음과 같은 출력이 생성됩니다.

--NAME: x:y
 --END: x:y Z a:b.c
 --END: x:y Z1 a1:b1.c1
--NAME: x1:y1
 --END: x1:y1 Z2 a2:b2.c2
 --END: x1:y1 Z3 a3:b3.c3
 --END: x1:y1 Z4 a4:b4.c4
--NAME: l:k
 --END: l:k s w:e.v

답변2

사용 방법

이 작은 sed명령이 작업을 수행합니다.

sed -ne '
  /^Name */{
    s/^.*= *//;
    h;
    tb;
  };
  /^End/bb;
  G;
  s/^\(.*\) *= *\(.*\)\n\(.*\)$/\3\t\1\t\2/p;
  :b
  ' <sourcefile.txt 
x:y Z       a:b.c
x:y Z1      a1:b1.c1
x1:y1       Z2      a2:b2.c2
x1:y1       Z3      a3:b3.c3
x1:y1       Z4      a4:b4.c4
l:k s       w:e.v

설명하다:

  • 줄이 다음으로 시작하는 경우이름, 까지 감소=, 그런 다음 태그에 저장 hold space하고 태그로 이동합니다 :b.
  • 줄이 다음으로 시작하는 경우, label 까지 다음 단계를 건너뜁니다 :b.
  • 라벨 앞 :b(다른 경우): hold space, than 추가만약에이 줄은 `문자열과 일치하며 그 뒤에는 임의 개수의 공백과 등호, 일부 공백, 두 번째 문자열, 개행 문자, 마지막으로 세 번째 문자열이 옵니다.그 다음에세 번째 문자열 다음에 탭 문자를 인쇄합니다. 첫 번째 문자열은 탭 문자이고 그 다음 두 번째 문자열입니다.

그리고 방금 사용하는 방법

while read line ;do
    if [ ${line//=*} = "Name" ] ;then
        name=${line//*=}
    else
        [ "${line//=*}" != "$line" ] &&
            printf "%s\t%s\t%s\n" $name ${line//=}
    fi
  done <sourcefile.txt 
x:y Z       a:b.c
x:y Z1      a1:b1.c1
x1:y1       Z2      a2:b2.c2
x1:y1       Z3      a3:b3.c3
x1:y1       Z4      a4:b4.c4
l:k s       w:e.v

답변3

이것은 펄입니다:

perl -ne 'if(/^Name\s*=\s*(.+)/){$n=$1;}else{print "$n $_" unless /^End/}' file

설명하다

perl -ne입력 파일을 한 줄씩 처리하고( -n), 각 줄을 변수에 저장하고 $_에 인수로 제공된 스크립트를 실행하는 것을 의미합니다 -e.

if(/Name\s*=\s*(.+)/){$n=$1;}: 줄이 Name = <something>. 로 시작하는 경우 . <something>로 저장합니다 $n.

그렇지 않고 행이 로 시작하지 않으면 행이 시작하지 않는 한 현재 값 , 이름 및 행의 나머지 부분이 Name인쇄됩니다 .$nEnd

관련 정보