Awk

AWK 結束獨立腳本

  • November 25, 2018

我開始這樣做.. 交換 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"

引用自:https://unix.stackexchange.com/questions/239638