删除字符串匹配bash的列

时间:2014-04-17 13:27:08

标签: bash awk sed

我遇到了以下问题。

我需要删除文件中包含标题中特定字符串的列。 分号作为列限制

以下示例

file 1
ADM_THO_CVL2000,ZO,AT;BS-CCI-BAL,ARA,EL;BS-TLI-MS,ARA,BG; 
1;2;3;
4;5;6;


file 2
BS-CCI-BAL,ARA,EL;BS-TLI-MS,ARA,BG;ADM_THO_CVL2000,OZ,ES;BAG-AL,W,SE;
1;2;3;5;
4;5;6;7;

ADM_THO_CVL2000是我需要删除的特定字符串。删除字符串和后续列后,结果如下:

BS-CCI-BAL,ARA,EL;BS-TLI-MS,ARA,BG; 
2;3;
5;6;

BS-CCI-BAL,ARA,EL;BS-TLI-MS,ARA,BG;BAG-AL,W,SE;
1;2;5;
4;5;7;

我看了一下互联网。

awk可以完成这项工作,但我所拥有的结果不是我期望的结果。我给你的代码如下:

awk '
FNR==1{
    for(i=1;i<=NF;i++)
        if ($i ~ str) {
          h=(h)?h FS $i:$i
          f=(f)?f FS i:i
        }
    print h
    nf=split(f,fA,FS);next
 }
 {
 for(i=1;i<=nf;i++)
       printf("%s%c",$fA[i], (i==nf)?ORS:FS)
}' str=ADM_THO_CVL2000, 'FS=;' filename.csv

我全心全意为你提出任何建议。

干杯

1 个答案:

答案 0 :(得分:1)

我之前的解决方案需要一些增强功能。由于你无法解决它,我发布了我的答案:

awk -F';' '/ADM_THO_CVL2000/{delete a; for (i=1; i<NF; i++) 
   if ($i ~ /ADM_THO_CVL2000/) a[i]; else printf "%s%s", $i, OFS; print $i; next} 
   {for (i=1; i<NF; i++) if (!(i in a)) printf "%s%s", $i, OFS; print $i }' OFS=';' file

file 1
BS-CCI-BAL,ARA,EL;BS-TLI-MS,ARA,BG;
2;3;
5;6;    

file 2
BS-CCI-BAL,ARA,EL;BS-TLI-MS,ARA,BG;BAG-AL,W,SE;
1;2;5;
4;5;7;
相关问题