Awk
AWK 結束獨立腳本
我開始這樣做.. 交換 csv 文件中的欄位,但我沒有完成腳本。我想要做的是連接從 2 到 7 的欄位,並按第一個欄位對它們進行分組。每一行都必須遵守欄位 1、8 和 9。
我的工作
BEGIN{ FS=";" OFS=""; x="\"\""; } { for(i=2;i<=7;i++){ if($i!= x) k=match(a[$1], $i); if (k == 0) { a[$1]=a[$1]";"$i; } b[$1]=b[$1]"-"$8""FS""$9; } END { for (g in a) t=split(a[g], A, ";"); if (t == 2) { a[g]=a[g]";"x";"x";"x";"x";"x";"; } if (t == 3) { a[g]=a[g]";"x";"x";"x";"x";"; } if (t == 4) { a[g]=a[g]";"x";"x";"x";"; } if (t == 5) { a[g]=a[g]";"x";"x";"; } for (h in b) q=split(b[h], B, "-"); for (z=1; z <= q; z++) b[h]=B[z]; } }
CSV 文件;
"1033reto";"V09B";"";"";"";"";"";"QVN";"V09B" "1033reto";"V010";"";"";"";"";"";"QVN";"V010" "1033reto";"V015";"";"";"";"";"";"QVN";"V015" "1033reto";"V08C";"";"";"";"";"";"QVN";"V08C" "1040reto";"V03D";"";"";"";"";"";"QVN";"V03D" "1040reto";"V01C";"";"";"";"";"";"QVN";"V01C" "1050reto";"V03D";"";"";"";"";"";"QVN";"V03D" "1050reto";"V01F";"V07L";"";"";"";"";"QVN";"V01C" .......
期望的輸出;
第一組是前四行中從 2 到 7 的欄位的串聯。然後對具有相同第一個欄位的每一行重複。第二組是從以下兩行中從 2 到 7 的欄位的串聯。然後對具有相同第一個欄位的每一行重複。第三組是從最後兩行開始的從 2 到 7 的欄位的串聯。然後對具有相同第一個欄位的每一行重複。
"1033reto";"V09B";"V010";"V015";"V08C";"";"QVN";"V09B" "1033reto";"V09B";"V010";"V015";"V08C";"";"QVN";"V010" "1033reto";"V09B";"V010";"V015";"V08C";"";"QVN";"V015" "1033reto";"V09B";"V010";"V015";"V08C";"";"QVN";"V08C" "1040reto";"V03D";"V01C";"";"";"";"";"QVN";"V03D" "1040reto";"V03D";"V01C";"";"";"";"";"QVN";"V01C" "1050reto";"V03D";"V01F";"V07L";"";"";"";"QVN";"V03D" "1050reto";"V03D";"V01F";"V07L";"";"";"";"QVN";"V01C" .......
awk腳本產生所需的輸出
awk ' BEGIN { FS = OFS = SUBSEP = ";" } $1 != f { for (i = 2; i < 8; i++) { line = line ";" A[i] A[i] = $i } if (NR > 1) for (j in B) print f line, j line = "" delete B count = 0 f = $1 } /^$/ { print $0 next } { for (i = 2; i < 8; i++) if ($i !~ /""/) A[i + count] = $i else break count += (i-2) B[$8, $9] = 1 } END { for (j in B) { printf "%s;", f for (i = 2; i < 8; i++) printf "%s;", A[i] print j } }' "CSV File"