중복된 줄을 병합하고 끝에 "N/A"를 추가하세요.

중복된 줄을 병합하고 끝에 "N/A"를 추가하세요.

텍스트 파일에 다음 줄이 있습니다. 중복된 행을 병합하고 필요에 따라 행 끝에 "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

그래서 거대한 파이프라인이 있습니다. 작동 방식은 다음과 같습니다.

  1. nl모든 입력 줄은 줄 번호 뒤에 삽입된 -s세미콜론 구분 기호 문자열을 사용하여 번호가 지정됩니다 ;.
  2. sort;입력에서 2cd 세미콜론으로 구분된 필드를 정렬합니다. 이것이 첫 번째 필드입니다.
  3. sed입력 줄을 동일한 첫 번째 필드와 재귀적으로 병합한 다음 문자열을 재귀적으로 추가합니다.;N/A6개 이상의 필드가 있을 때까지 각 줄의 끝으로 이동합니다.
  4. sort첫 번째 필드를 다시 정렬합니다. 이번에는 숫자로 nl입력을 원래 계산 순서로 재정렬합니다.
  5. 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

당신이 왜 이런 짓을 했는지 상상할 수 없습니다.

관련 정보