CSV 按第 3 列和前面的计数器排序

CSV 按第 3 列和前面的计数器排序

我想从这张桌子上

"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 列(已售出)中,只要客户 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函数“更喜欢”右侧映射中的值。

相关内容