2014-12-12 2 views
0

나는 아직도 리눅스 명령을 배우고, 누군가가 내가 뭘하려고 오전 나를 도울 수 있는지 궁금 해서요 :리눅스는 조건 패턴을 대체 명령

3  rs123  0  600001 A  G 
3  rs345  0  600002 T  G 
3 3:124369637:A_G 0 124369637 A G 
3 3:124369637:G_GT 0 124369637 G GT 

그리고 :이 같은 파일이 나는 5 번째와 6 번째 컬럼의 길이가 1보다 큰 경우에만 콜론의 두 번째 발생 후 "ID"로 대체하려고합니다. 길이가 1 인 경우에는 두 번째 발생 이후의 모든 것을 제거해야합니다. 콜론. 그래서 나는 이것을 싶습니다

3  rs123  0  600001 A  G 
3  rs345  0  600002 T  G 
3 3:124369637 0 124369637 A G 
3 3:124369637:ID 0 124369637 G GT 

나는 여러 가지 방법으로 시도, 나는 어떤 점까지 얻을 수 있지만, 나는 마지막 부분에 붙어있다. 또한, 내가 지금 가지고있는 것은 길고 뒤틀린 것처럼 보입니다. 어떤 조언도 대단히 감사합니다! 고맙습니다!

우선이 추가 않는다 "ID를"모든 경우에이 형식 3 : 124,369,637 :

awk -F' ' '//{gsub(/[:][A-Za-z].*/, ":ID", $2); print} file.txt 
다음

난 단지 경우에 ID를 유지하기 위해이 시도 곳 열 다섯의 길이와 6> 1이다 (하지만이 작동하지 않습니다) :

awk -F' ' '{ 
if (length($5) ==1 && length($6) ==1 && $2 ~/ID/) 
    gsub(/ID/,"");print; 
    else 
    print; 
    }' file.txt 
+0

다섯 번째 열이 1보다 큽니까? 하지만 편지입니다 – zhujs

+0

안녕하십니까, 5 번째 열의 길이가 1보다 큽니다 (즉, A 대신 AG) – user971102

답변

2
awk -v OFS='\t' ' 
{ 
    if (length($5) == 1 && length($6) == 1) 
    { 
     sub(/:[^:]*$/, "", $2) 
     print 
    } 
    else if (length($5) >= 1 && length($6) >= 1) 
    { 
     sub(/:[^:]*$/, ":ID", $2) 
     print 
    } 
    else 
     print 
}' 
file.txt 

이보십시오. 당신은 대체 logit을 수정하기를 원할 것입니다. 모든 라인에는 적어도 두 개의 콜론이 있다고 가정합니다.

+0

친애하는 zhujs, 이것은 정확히 내가하려고했던 것입니다! 정말 고마워!! 나는 이제 if/else 문에 대한 지식이 부족하다는 것을 알게되었습니다 ... 도움을 주셔서 감사합니다! – user971102