2013-05-22 3 views
2

.tab 파일의 특정 필드의 첫 번째 문자를 제외한 모든 문자를 제거하려고합니다. 나는 필드 (10)와문자열의 첫 번째 문자를 특정 단일 필드에 유지

일반적으로 필드 그들에 35 개 문자가 11 만 첫 번째 문자를 유지하려면, 그래서 내가 사용 :

awk '{gsub ("..................................$","",$10;print} file 

그러나, 35 미만이 일부 필드가 있으며, 이 replace 함수에 의해 무시되었습니다. 하위 문자열을 사용하는 데 지겹지 만 특정 필드를 지정하는 방법을 알 수 없습니다. 나는 기능

perl -pe 's/(.).*/$1/g' 

를 사용할 수 있지만 내가 그렇게하고 입력 값으로 필드를 사용하는 방법을 잘 모르겠습니다 있도록 AWK 내부에 펄을 사용하는 방법이 생각, 그래서 파일을 제외하고 동일 나온다 변경된 필드.

거기에 perl과 동등한 작업을 수행 할 수있는 방법이 있습니까?

도움을 받으실 수 있습니다! awk를 사용

답변

3

한 가지 방법 :

awk '{ for (i=10;i<=11;i++) { $i = substr($i, 1, 1) } } { print }' infile 
+0

하나가 멋지게 다. '{print} '는'1 '로 바꿀 수 있지만. :) –

+0

는 매력처럼 일했습니다. 원격으로 a 정의 섹션을 이해 합니다만, akw에 대한 루프에서 어떻게 작동하는지 혼란 스럽습니다. 누구든지 루프를 사용하여 읽기를 제안하고 awk에서 substr을 사용할 수 있습니까? – jeffpkamp

+0

Effective Awk Programming, 제 3 판 아놀드 로빈스. 또는 "C"책을 루프로 읽고 substr()은 awk와 C에서 동일합니다. –

1

gawk

gawk '{ for (i=10;i<=11;i++) { $i = gensub(/(.).*/ , "\\1", G , $i) } }1' infile 
1

최단 awk 버전의 gensub 기능을 사용하는 또 다른 방법은, 내가 알아낼 수 :

awk '($10=substr($10,1,1))&&$11=substr($11,1,1)' infile 

10이 경우, 및/또는 11 번째 필드 존재하지 않으면 라인이 인쇄되지 않습니다. perl

perl -ane '$F[9]=~s/(.).*/$1/;$F[10]=~s/(.).*/$1/;print "@F\n"' infile 

에서

유사 버전이 10 및/또는 11 필드가 정의되어 있지 않은 경우에도 행을 인쇄합니다. 펄와

1

또 다른 방법 :

perl -pe '$c=0; s/(\S+)/(++$c < 10 || $c > 11) ? $1 : substr($1,0,1)/eg' filename 
관련 문제