텍스트 파일에 다음 줄이 있습니다. 중복된 행을 병합하고 필요에 따라 행 끝에 "N/A"를 추가하여 각 행에 6개의 열이 있도록 하고 싶습니다.
302C21;tSMe
S123C;1.17
302C21;2;346;SM-1-3/SM-1-4
SIEV1;tSMe
S123C;3;2225;20225
SIEV1;1;3;SM-1-1/SM-1-2;5
OUTPUT
SIEV1;tSMe;1;3;SM-1-2;5
302C21;tSMe;2;346;SM-1-3/SM-1-4;N/A
S123C;3;2225;20225;1.17;N/A
답변1
{ nl -s\; -w1 -ba |
sort -t\; -k2,2 |
sed -e:n -e'h;$!N' \
-e's/^\([^;]*\(;[^;]*;\).*\)\n[^;]*\2/\1;/;tn' \
-ex -e:N \
-e's/;/;/6p;tD' \
-e's|$|;N/A|;tN'\
-e:D -ex -eD |
sort -t\; -nk1,1 |
cut -d\; -f2-;
} <in >out
그래서 거대한 파이프라인이 있습니다. 작동 방식은 다음과 같습니다.
nl
모든 입력 줄은 줄 번호 뒤에 삽입된-s
세미콜론 구분 기호 문자열을 사용하여 번호가 지정됩니다;
.sort
;
입력에서 2cd 세미콜론으로 구분된 필드를 정렬합니다. 이것이 첫 번째 필드입니다.sed
입력 줄을 동일한 첫 번째 필드와 재귀적으로 병합한 다음 문자열을 재귀적으로 추가합니다.;N/A
6개 이상의 필드가 있을 때까지 각 줄의 끝으로 이동합니다.sort
첫 번째 필드를 다시 정렬합니다. 이번에는 숫자로nl
입력을 원래 계산 순서로 재정렬합니다.cut
에서 원래 삽입한 줄 번호와 구분 기호를 제거합니다nl
.
산출:
302C21;tSMe;2;346;SM-1-3/SM-1-4;N/A
S123C;1.17;3;2225;20225;N/A
SIEV1;tSMe;1;3;SM-1-1/SM-1-2;5
이 결과는 귀하의 결과와 다릅니다. 정렬이 반대인 것 같지만 그렇지 않습니다. 당신이 찾고 있는 것이 무엇인지 명확히 밝히지 않는 한, 그게 전부입니다.
PS 저는 이런 식으로 작성했습니다. 모두 한 줄에 연결되는지는 중요하지 않습니다. 따라서 모든 줄 바꿈과 이전 백슬래시를 제거하여 한 줄로 만들 수 있습니다.
이와 같이:
{ nl -s\; -w1 -ba | sort -t\; -k2,2 | sed -e:n -e'h;$!N' -e's/^\([^;]*\(;[^;]*\;).*\)\n[^;]*\2/\1;/;tn' -ex -e:N -e's/;/;/6p;tD' -e's|$|;N/A|;tN' -e:D -ex -eD | sort -t\; -nk1,1 | cut -d\; -f2-; } <in >out
당신이 왜 이런 짓을 했는지 상상할 수 없습니다.