使用 AWK 编辑 .csv 文件
Edit .csv file with AWK
我有一个 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"
期望的输出:
"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=";"}
NR==FNR{for(i=2;i<=7;i++) if($i!="\"\"") a[]=a[] FS $i;next}
{n=split(a[],f,FS); for(i=2;i<=n;i++) $i=f[i]}1' csv{,}
"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"
更新:为了保护最后两个字段,在拆分后添加 if(n>7)n=7;
。
我有一个 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"
期望的输出:
"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=";"}
NR==FNR{for(i=2;i<=7;i++) if($i!="\"\"") a[]=a[] FS $i;next}
{n=split(a[],f,FS); for(i=2;i<=n;i++) $i=f[i]}1' csv{,}
"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"
更新:为了保护最后两个字段,在拆分后添加 if(n>7)n=7;
。