私はこのテーブルで欲しい
"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;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- すべての項目は、2列に基づいてソートする必要があります。
- その後、1列と2列を削除する必要があります。
- 「販売済み」列を追加する必要があります。 (新規)
- 次に、列1(Sold)には、顧客1が列2にある限り、すべての行にwer s01を挿入する必要があります。顧客2が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
最初の2列を切り取る方法をお知らせします。私はあなたを緊張させないでしょう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
右マップの値を「優先」する機能です。