2013-11-10 3 views
4

어떤 필드에있는 네 번째 문자 ":"다음에 오는 내용을 제거하고 싶습니다. 예를 참조하십시오 :다음 항목 제거 N 번째 항목 사용 한 줄 짜임새 사용

입력 :

1 10975  A C 1/1:137,105:245:99:1007,102,0 0/1:219,27:248:20:222,0,20 
1 19938  T TA ./.        1/1:0,167:167:99:4432,422,0,12,12 
12 20043112 C G 1/2:3,5,0:15:92     2/2:3,15:20:8 

예상 출력 :이

1 10975  A C 1/1:137,105:245:99 0/1:219,27:248:20 
1 19938  T TA ./.     1/1:0,167:167:99 
12 20043112 C G 1/2:3,5,0:15:92  2/2:3,15:20:8 

그래서 기본적으로 모든 필드 ":"다음 무엇을 그 등의 발생을 제거해야합니다. 세 번째 줄은 아무 것도 바뀌지 않으므로 ":"은 세 번 나타납니다. 나는 시도하고 첫 번째 줄과 더 쉼표를 가지고로하지 SECOD 만 작동하지 않았다 솔루션 (좋지 않은) ","

불완전한 해결책 발견 : 사전에

sed 's/:[0-9]*,[0-9]*,[0-9]*//g' 

감사합니다 마지막 필드 5 내지 필드에서

답변

2

이것은 :[^:]+

필드 5에서
< file.txt awk '{ for (i=5; i<=NF; i++) $i = gensub(/:[^:]+/, "", 4, $i) }1' | column -t 

마지막 필드, 생까지 정규 표현식의 네 번째 발생을 제거 의 네 번째 : 후 모든 것을 제거합니다

< file awk '{ for (i=5; i<=NF; i++) $i = gensub(/((:[^:]+){3}).*/, "\\1", 1, $i) }1' | column -t 

설명 : 다시 읽는 질문시

, 두 번째 솔루션은 당신이 찾고있는 무엇을 아마. 첫 번째 해결책은 콜론이 아닌 하나 이상의 문자가 따라 오는 콜론을 찾아 제거합니다. gensub()의 세 번째 인수는 대체 할 정규 표현식의 일치 항목을 설명합니다. 따라서 a 4는 gensub()에게 패턴의 네 번째 일치 항목을 제거하라고 지시합니다. 두 번째 해법은 첫 번째 해답에 설명 된 세 가지 정규식을 찾습니다. 이 시점에서 gensub()sub() 또는 gsub()을 사용할 수없는 추가 기능을 제공한다고 언급 할 가치가 있습니다. 이것은 대체 텍스트에 정규 표현식의 구성 요소를 지정하는 기능입니다. 다른 언어에서 캡처를 수행하는 데 괄호를 사용하는 방법과 비슷합니다. gensub()은 GNU awk를 사용하는 경우에만 사용할 수있는 매우 강력한 명령입니다. 제공된 설명과 예제는 here이 매우 유용합니다. HTH.

결과 :

1 10975  A C 1/1:137,105:245:99 0/1:219,27:248:20 
1 19938  T TA ./.     1/1:0,167:167:99 
12 20043112 C G 1/2:3,5,0:15:92  2/2:3,15:20:8 
+0

또한, 단지'변경 | -t 열에서'OFS = "\ t"' – Steve

+0

고마워요. gensub 명령을 설명해주십시오. gensub, sub, gsub의 차이점은 무엇입니까? – user1421408

+0

@ user1421408 :이 명령과 관련된 몇 가지 설명을 추가했습니다. 의견을 참조하십시오. HTH. – Steve

3

sed

sed -r 's/((:[^ ]*){3}):[^ ]*/\1/g' file 

출력 사용 : 사용

1 10975  A C 1/1:137,105:245:99 0/1:219,27:248:20 
1 19938  T TA ./.        1/1:0,167:167:99 
12 20043112 C G 1/2:3,5,0:15:92     2/2:3,15:20:8 

perl

,
perl -pe 's/((:\S*){3}):\S*/$1/g' file 
+0

왜'perl -pe 's/((: \ S *) {3}) : \ S */$ 1/g''? –

+0

@ Hynek-Pichi-Vychodil 감사합니다. 업데이트 됨. 'perl'과'sed'를 혼합해서 사용합니다 ... – jkshah

5

sed를

sed -r 's/((:[^: \t]*){3}):[^ \t]*/\1/g' file | column -t 

펄 : 당신은 탭으로 구분 된 출력을 원하는 경우

perl -pe 's/((:\S*){3}):\S*/$1/g' file | column -t 
0
perl -lane 's/(.*?:.*?:.*?:.*?):.*/$1/g for @F ; printf "@F"."\n"' your_file