awk를 사용하여 각 줄의 처음 두 부분을 추출합니다.

awk를 사용하여 각 줄의 처음 두 부분을 추출합니다.

다음과 같은 공백으로 구분된 파일이 있습니다.

0   22:16050847:T:C 0   16050847
0   rs62224609:16051249:T:C 0   16051249
0   22:16051250:G:A 0   16051250
0   GSA-rs138295790 0   16057310

처음 두 부분만 추출하도록 두 번째 열을 수정하려면 어떻게 해야 합니까? 내 출력은 다음과 같습니다.

0   22:16050847 0   16050847
0   rs62224609:16051249 0   16051249
0   22:16051250 0   16051250
0   GSA-rs138295790 0   16057310

답변1

짧은접근하다:

awk '{split($2,a,":"); $2=(length(a)>1)? a[1]":"a[2] : $2}1' file

출력:

0 22:16050847 0 16050847
0 rs62224609:16051249 0 16051249
0 22:16051250 0 16051250
0 GSA-rs138295790 0 16057310

  • split($2,a,":")- 두 번째 필드를 a구분 기호로 배열로 분할합니다.:

답변2

GNU awk가 있는 경우:

gawk '{split($2,a,/[:-]/,c); $2 = sprintf("%s%c%s", a[1], c[1], a[2])} 1' file
0 22:16050847 0 16050847
0 rs62224609:16051249 0 16051249
0 22:16051250 0 16051250
0 GSA-rs138295790 0 16057310

답변3

와 함께 perl:

perl -lpe 's/^\S+\s+[^:]+:[^:]+\K\S+//' file

GNU를 사용하면 sed:

sed -E ':t s/:\w+//2; tt' file

산출:

0   22:16050847 0   16050847
0   rs62224609:16051249 0   16051249
0   22:16051250 0   16051250
0   GSA-rs138295790 0   16057310

답변4

세게 때리다:

while read -r f1 f2 rest; do
   printf '%s' "$f1" "$(expr " $f2" : '\([^:]*:[^:]*\).*' \| " $f2")" "$rest"; echo
   # the lone echo provides for the newline
done < yourfile

read$f1필드를 , 로 분할 $2하고 나머지는 모두 로 묶습니다 $rest. 그런 다음 두 번째 필드에서 콜론으로 구분된 첫 번째 및 두 번째 필드를 추출하기 위해 $f2실행합니다 . expr이것이 가능하지 않다면 결국 $f2변수 자체를 사용하게 됩니다.

설정:

sed -e '
   s/[^[:space:]]\{1,\}/\
&\
/2
   :loop
      s/\n\(.*:.*\):.*\n/\n\1\n/
   tloop
   s/\n//g
' yourfile

먼저 두 번째 필드를 둘러싸서 \n두 개의 필드(또는 하나의 필드 구분 기호)만 남을 때까지 이 영역 주위에 루프를 실행합니다.

펄:

perl -pe 's/\G[^:\h]+:[^:\h]+\K\S+//,next while /\S\h+\S/g' yourfile

perl -pe 's/^\h*\S+\h+(?:(?!:)\S)+:(?:(?!:)\S)+\K\S+//' yourfile

perl -F'(\h+)' -lane '
   /:/ and $_ = join ":", (/[^:]+/g)[0,1] for $F[/^\h/?4:2];
   print @F;
' yourfile

결과

0   22:16050847 0   16050847
0   rs62224609:16051249 0   16051249
0   22:16051250 0   16051250
0   GSA-rs138295790 0   16057310

관련 정보