다음과 같은 입력이 있습니다.
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;