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