3열 및 이전 카운터를 기준으로 CSV 정렬

3열 및 이전 카운터를 기준으로 CSV 정렬

나는 이 테이블에서 원한다

"ResNR";"ResNAME";"CustomerNAME";"CustomerID";"Date";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"
"12431";"TEST";"Kunde 1";"10272";"20.06.2017 10:35";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"
"12431";"TEST";"Kunde 2";"10207";"13.11.2017 14:08";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"
"12431";"TEST";"Kunde 2";"10328";"09.05.2018 09:22";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"
"12431";"TEST";"Kunde 1";"10189";"16.05.2018 17:47";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"
"12431";"TEST";"Kunde 3";"10189";"18.06.2018 20:07";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"
"12431";"TEST";"Kunde 1";"10229";"13.11.2018 11:14";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"
"12431";"TEST";"Kunde 2";"10348";"28.01.2019 09:06";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"
"12431";"TEST";"Kunde 3";"10340";"06.02.2019 11:13";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"
"12431";"TEST";"Kunde 1";"10349";"22.02.2019 17:06";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"
"12431";"TEST";"Kunde 2";"10333";"27.02.2019 20:18";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"

출력은 다음과 같이 표시되어야 합니다. 모든 항목은 고객 이름을 기준으로 정렬되어야 합니다. 처음 2개 열은 삭제할 수 있습니다. 그런 다음 카운터는 첫 번째 열로 들어가야 합니다.

Sold;CustomerNAME;CustomerID;Date;Column1;_1;_2;_3;_4;_5;_6;_7;_8;_9;_10;_11;_12;_13;_14;_15;_16;_17;_18;_19;_20;_21;_22;_23;_24;_25;_26;_27
s01;Kunde 1;10272;20.06.2017 10:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;
s01;Kunde 1;10189;16.05.2018 17:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;
S01;Kunde 1;10229;13.11.2018 11:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;
s01;Kunde 1;10349;22.02.2019 17:06;;;;;;;;;;;;;;;;;;;;;;;;;;;;
s02;Kunde 2;10207;13.11.2017 14:08;;;;;;;;;;;;;;;;;;;;;;;;;;;;
s02;Kunde 2;10328;09.05.2018 09:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;
s02;Kunde 2;10348;28.01.2019 09:06;;;;;;;;;;;;;;;;;;;;;;;;;;;;
s02;Kunde 2;10333;27.02.2019 20:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;
s03;Kunde 3;10189;18.06.2018 20:07;;;;;;;;;;;;;;;;;;;;;;;;;;;;
s03;Kunde 3;10340;06.02.2019 11:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1. 모든 항목은 2열을 기준으로 정렬되어야 합니다.
  2. 그러면 1열과 2열을 삭제해야 합니다.
  3. '판매됨' 열을 추가해야 합니다. (새로운)
  4. 그런 다음 열 1(Sold)에는 고객 1이 열 2에 있는 한 모든 행에 wer s01을 삽입해야 합니다. 고객 2가 두 번째 열에 있는 경우 첫 번째 열의 값은 s01에서 s02, ETC로 올라가야 합니다.

지금 스크립트를 시도하고 있는데 불행히도 작동하지 않습니다.

sed 's/,/./g' |
awk -F";" 'BEGIN{
 oldRef=""
 OFS="\t"
}{
 if(NR==1){
  $1=$1
 }else{
  if($4 != oldRef){$1="s01";oldRef=$4}else{$1="s02"}
 }
 print $0
}' | column -t -o ";" -s $'\t'

답변1

귀하의 칼럼이 어디서 왔는지는 모르겠지만 Sold대부분은 매우 기본적인 내용입니다.

man cut처음 두 열을 자르는 방법을 알려 드리겠습니다. 난 당신을 긴장하게 만들지 않을 거예요 cut -'d;' -f3-.

그 다음에는 고객 이름이 첫 번째 열에 있으므로 sort이를 사용하여 올바른 순서로 정렬할 수 있습니다.

"또한 파일에서 해당 항목을 제거한 것 같으 므로 sed 's/"//g'그것도 필요합니다.

그래서,

cut -'d;' -f3- < table | sed 's/"//g' | sort

누락된 열 생성을 제외한 모든 작업이 수행됩니다.

답변2

아마도 강제 POSIX 도구를 사용하여 수행하려는 작업은 다음과 같습니다.

$ cat tst.sh
#!/usr/bin/env bash

awk -v OFS=';' '{ print (NR>1), $0 }' "${@:--}" |
sort -t';' -k1,1n -k4,4 |
awk '
    BEGIN { FS=OFS=";" }
    {
        sub(/([^;]*;){3}/,"")
        gsub(/"/,"")
    }
    NR == 1 {
        sold = "Sold"
        $4 = "Column1"
        for ( i=5; i<=NF; i++ ) {
            $i = "_" (i-4)
        }
    }
    NR > 1 {
        if ( $1 != prev ) {
            cnt++
            prev = $1
        }
        sold = sprintf("s%02d",cnt)
    }
    { print sold, $0 }
'

$ ./tst.sh file
Sold;CustomerNAME;CustomerID;Date;Column1;_1;_2;_3;_4;_5;_6;_7;_8;_9;_10;_11;_12;_13;_14;_15;_16;_17;_18;_19;_20;_21;_22;_23;_24;_25;_26;_27
s01;Kunde 1;10189;16.05.2018 17:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;
s01;Kunde 1;10229;13.11.2018 11:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;
s01;Kunde 1;10272;20.06.2017 10:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;
s01;Kunde 1;10349;22.02.2019 17:06;;;;;;;;;;;;;;;;;;;;;;;;;;;;
s02;Kunde 2;10207;13.11.2017 14:08;;;;;;;;;;;;;;;;;;;;;;;;;;;;
s02;Kunde 2;10328;09.05.2018 09:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;
s02;Kunde 2;10333;27.02.2019 20:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;
s02;Kunde 2;10348;28.01.2019 09:06;;;;;;;;;;;;;;;;;;;;;;;;;;;;
s03;Kunde 3;10189;18.06.2018 20:07;;;;;;;;;;;;;;;;;;;;;;;;;;;;
s03;Kunde 3;10340;06.02.2019 11:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;

답변3

일치하지 않는 후행 절반을 제거한 후 ;"다음을 사용하십시오.

mlr --icsv --ocsvlite --fs ';' sort -f CustomerNAME then put '
  begin{@s = {}}; 
  @s = mapsum({$CustomerNAME: fmtnum(length(@s)+1,"s%02d")},@s); 
  $Sold = @s[$CustomerNAME]
' then reorder -f Sold then cut -x -f ResNR,ResNAME then rename "",Column_1 input.csv
Sold;CustomerNAME;CustomerID;Date;Column_1;_2;_3;_4;_5;_6;_7;_8;_9;_10;_11;_12;_13;_14;_15;_16;_17;_18;_19;_20;_21;_22;_23;_24;_25;_26;_27
s01;Kunde 1;10272;20.06.2017 10:35;;;;;;;;;;;;;;;;;;;;;;;;;;;
s01;Kunde 1;10189;16.05.2018 17:47;;;;;;;;;;;;;;;;;;;;;;;;;;;
s01;Kunde 1;10229;13.11.2018 11:14;;;;;;;;;;;;;;;;;;;;;;;;;;;
s01;Kunde 1;10349;22.02.2019 17:06;;;;;;;;;;;;;;;;;;;;;;;;;;;
s02;Kunde 2;10207;13.11.2017 14:08;;;;;;;;;;;;;;;;;;;;;;;;;;;
s02;Kunde 2;10328;09.05.2018 09:22;;;;;;;;;;;;;;;;;;;;;;;;;;;
s02;Kunde 2;10348;28.01.2019 09:06;;;;;;;;;;;;;;;;;;;;;;;;;;;
s02;Kunde 2;10333;27.02.2019 20:18;;;;;;;;;;;;;;;;;;;;;;;;;;;
s03;Kunde 3;10189;18.06.2018 20:07;;;;;;;;;;;;;;;;;;;;;;;;;;;
s03;Kunde 3;10340;06.02.2019 11:13;;;;;;;;;;;;;;;;;;;;;;;;;;;

여기서 열에 번호를 매기는 "트릭"은 Sold현재 CustomerNAME과 동일한 키와 맵의 현재 항목 수보다 1 더 많은 값을 사용하여 아웃플로우 맵에 새 항목을 추가 하려고 한다는 것입니다 @s. 중복 키의 경우 mapsum오른쪽 맵의 값을 "선호"하는 기능입니다.

관련 정보