다음 행의 각 필드에 패턴 추가

다음 행의 각 필드에 패턴 추가

다음과 같은 입력이 있습니다.

MX04A;
DMX04A; DMX04A; LMX04A; LMX04A;
-17.2; -15.3; -14.3; -13.6;
-16.8; -15.4; -16.0; -15.3;
LH36A;
DLH36A; DLH36A;
-11; -117.2;
-11; -17.5;

이 출력을 얻고 싶습니다.

 MX04A:DMX04A; MX04A:DMX04A; MX04A:LMX04A; MX04A:LMX04A;
 -17.2; -15.3; -14.3; -13.6;
 -16.8; -15.4; -16.0; -15.3;

 LH36A:DLH36A; LH36A:DLH36A;
 -11; -117.2;
 -11; -17.5;

답변1

최소한 샘플 데이터에 대해 작동하는 시작은 다음과 같습니다.

sed -r '/[A-Z];/{N;s/([^;]+);\n([^ ]+) ([^ ]+) ([^ ]+) ([^ ]+)/\1:\2 \1:\3 \1:\4 \1:\5/;3,$s/^/\n/};s/^/ /' input.txt

이는 다음을 가정합니다.

  • 각 레코드의 첫 번째 줄에는 항상 대문자가 있습니다.
  • 각 레코드의 라인 2는 항상 라인 1을 따릅니다.
  • 각 레코드의 행 2에는 항상 정확히 4개의 필드가 있습니다(일반화할 수 있지만 현재는 정확히 4개여야 함).
  • 각 레코드의 나머지 줄은 항상 순수한 숫자입니다. 즉, 문자가 없습니다.
  • 모든 필드는 로 구분됩니다 space semicolon.
  • 출력의 레코드는 빈 줄로 구분되어야 하지만, 출력의 시작이나 끝 부분에는 추가 빈 줄이 없어야 합니다.

답변2

다음은 작동합니다:

sed -e'/-/!N;/;\n/!b' <i >o \
    -e's//:/;y/ /\n/;:n'    \
    -e's/^\(\([^:]*\).*\)\n/\1 \2:/;tn'

또는 -E확장 정규식 구문을 사용하세요.(적어도 AST/BSD/GNU에서는 작동합니다 sed):

sed -Ee'/-/!N;/;\n/!b' <i >o \
     -e's//:/;y/ /\n/;:n'    \
     -e's/^(([^:]*).*)\n/\1 \2:/;tn'

...큰 차이는 없으며 길이도 3자 더 짧습니다.

아니면 줄을 서서(몇 가지 이유)...

sed -Ee'/-/!N;/;\n/!b' -e's//:/;y/ /\n/;:n' -e's/^(([^:]*).*)\n/\1 \2:/;tn' <i >o

산출


MX04A:DMX04A; MX04A:DMX04A; MX04A:LMX04A; MX04A:LMX04A;
-17.2; -15.3; -14.3; -13.6;
-16.8; -15.4; -16.0; -15.3;
LH36A:DLH36A; LH36A:DLH36A;
-11; -117.2;
-11; -17.5;

답변3

이 질문의 첫 번째 버전에 대한 답변(데이터 변경 전)

$ awk '/^[^;]*[[:alpha:]];/{a=$1; if (NR!=1)print"";getline; gsub(/(^| )/, " "substr(a,1,length(a)-1)":");print;next} {print " "$0;}' file
 MX04A:DMX04A; MX04A:DMX04A; MX04A:LMX04A; MX04A:LMX04A;
 -17.2; -15.3; -14.3; -13.6;
 -16.8; -15.4; -16.0; -15.3;

 LH36A:DLH36A; LH36A:DLH36A; LH36A:LLH36A; LH36A:LLH36A;
 -11; -117.2; 115.5; 16.8;
 -11; -17.5; 113.2; 15.6;

또는:

$ awk -F';' '$1 ~ /[[:alpha:]]/ {a=$1; if (NR!=1)print""; getline; gsub(/(^| )/, " " a ":"); print; next} {print " "$0;}' file
 MX04A:DMX04A; MX04A:DMX04A; MX04A:LMX04A; MX04A:LMX04A;
 -17.2; -15.3; -14.3; -13.6;
 -16.8; -15.4; -16.0; -15.3;

 LH36A:DLH36A; LH36A:DLH36A; LH36A:LLH36A; LH36A:LLH36A;
 -11; -117.2; 115.5; 16.8;
 -11; -17.5; 113.2; 15.6;

관련 정보