啊。交换csv文件中的字段

啊。交换csv文件中的字段,csv,awk,Csv,Awk,csv文件包含九个字段。必须遵守字段$1、$8和$9。添加字段$2、$3、$4、$5、$6和$7,并在重复字段$1的行中替换它们。很难描述规则 我必须完成这件事或者做类似的事情。我需要独立的脚本 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; }

csv文件包含九个字段。必须遵守字段$1、$8和$9。添加字段$2、$3、$4、$5、$6和$7,并在重复字段$1的行中替换它们。很难描述规则

我必须完成这件事或者做类似的事情。我需要独立的脚本

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];                               
}
}
所需输出

"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"

通过研究Karakfa代码,我找到了一个没有双旁路的替代方案

BEGIN{
FS=";"
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)
{
    sub("^;","",a[g]);
    t=split(a[g], A, ";");
    for (y=t; y<6; y++)
    {
        a[g]=a[g]";"x;
    }

    mx=split(b[g], B, "-");
    for (i=2; i<=mx; i++)
    {
        print g""FS""a[g]""FS""B[i];
    }
}
开始{
FS=“;”
x=“\”\”;
} 
{

对于(i=2;我这里是CSV文件?它看起来与您已经接受答案的地方的输入和期望输出相同。这里有些不同?我不知道如何将数组a与并行的数组b连接起来。“1033reto”;“V09B”;“V010”;“V015”;“V08C”;+“QVN”;“V09B”@jas这是真的。但我需要在没有-->}1 file.CSV{你能帮忙吗?@Craitos试着理解另一种解决方案,也许你会学到一两件事。实现两次传递算法更容易,否则你必须对整个文件进行操作或编写复杂的逻辑。另外,
filename{,}
是一个bash速记,用于两次编写
filename
@karakfa我想知道你对我的最新代码的看法,它是受你的启发编写的。
BEGIN{
FS=";"
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)
{
    sub("^;","",a[g]);
    t=split(a[g], A, ";");
    for (y=t; y<6; y++)
    {
        a[g]=a[g]";"x;
    }

    mx=split(b[g], B, "-");
    for (i=2; i<=mx; i++)
    {
        print g""FS""a[g]""FS""B[i];
    }
}