2014-04-17 3 views
0

다음 문제가 발생합니다.문자열 일치 bash가있는 열 제거

헤더에서 특정 문자열이 포함 된 파일 내의 열을 제거해야합니다. 세미콜론이

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 이하로 제한 열

예로 행동하면 I가 제거해야하는 특정 문자열이다. 문자열과 그 이후의 열이 제거되면 그 결과는 다음과 같습니다.

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 

나는 여러분의 제안에 귀 기울입니다.

건배

+0

오 잘. 학교 운동처럼 보입니다. 똑같은 질문이 몇 시간 전에 물었다. – devnull

+0

Devnull : 아무것도 찾을 수 없습니다. @ Ashkhan : 답변을 확인하십시오. –

+0

모든 입력은 1 파일에서 2 블록이거나 2 입력 파일이 될 수 있습니까? 중요한 점은 분명합니다. –

답변

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; 
+0

그에게 건배 @anubhava. 아니, 이번엔 혼자서 그걸 알아낼 수 없었다. 다시 한번 감사드립니다. –

+0

환영합니다. 다행스럽게도 다행입니다. – anubhava

+0

알다시피, 나는 바보 같지만 실제로는, 너와 다른 사람들이 얼마나 지식이 있는지, 벙어리이다. 나는 당신이 내게 여기서 가르치고있는 것을 다른 사람들에게 전하기 때문에 내가 일하는만큼의 일을하고 있기를 바란다. 불만을 토로 한 것에 대해 유감스럽게 생각합니다. 이전에 다루지 않은 문제와 방법을 다룰 때 당당한 부담을 느낍니다. 다시 건배. –