sed 또는 awk를 사용하여 문자열의 시작과 끝이 알려진 특정 열에서 문자열을 제거합니다.

sed 또는 awk를 사용하여 문자열의 시작과 끝이 알려진 특정 열에서 문자열을 제거합니다.

내 파일에는 다음과 같은 줄이 포함되어 있습니다.

1 10241 rs960927773 POS=10241;VP=0x05;GINFO=DDX11L1:100287102;R5;ASP

POS로 시작하고 ;GINFO=로 끝나는 4열의 모든 항목을 삭제하고 싶습니다.

내 생각엔 이것이 효과가 있을 것 같다:sed -e 's/POS=.*;GINFO=//‘ file > new_file

가능하다면 4열을 구체적으로 가리키는 방법은 무엇입니까?

답변1

네 번째 열을 직접 지정하려면 다음 명령을 사용하십시오.awk방법:

awk '{ sub(/^POS.*GINFO=/, "", $4) }1' file > new_file
  • $4- 네 번째 필드를 가리킵니다.
  • sub(/^POS.*GINFO=/, "", $4)/^POS.*GINFO=- 네 번째 필드의 패턴으로 제공된 하위 문자열을 바꿉니다.

답변2

참조하는 열과 알려진 열이 공백으로 구분되어 있는 경우 다음을 수행할 수 있습니다.

sed -E 's/^(([^ ]* ){3})POS=.*;GINFO=/\1/' infile

이 일치는 첫 번째 공백이 보일 때까지 ^(([^ ]* ){3})행을 요청하는 것으로 시작 하고 이를 최대 횟수만큼 반복합니다. 대괄호는 이 일치를 역참조와 그룹화된 일치로 만들고 나중에 대체 부분으로 복원합니다 .^*[^ ]{3}\1s/pattern/replace/

이는 (...)POS=.*;GINFO=또한 표시 될 때까지 POS=뒤따르는 모든 항목 과 일치하며 출력에서 ​​제거됩니다..*;GINFO

아래에 제공된 예제 데이터의 경우:

1 10241 POS=rs960927773 POS=10241;VP=0x05;GINFO=DDX11L1:100287102;R5;ASP
1 POS=10241 rs960927773 POS=10241;VP=0x05;GINFO=DDX11L1:100287102;R5;ASP
POS=1 10241 rs960927773 POS=10241;VP=0x05;GINFO=DDX11L1:100287102;R5;ASP

결과를 반환합니다:

1 10241 POS=rs960927773 DDX11L1:100287102;R5;ASP
1 POS=10241 rs960927773 DDX11L1:100287102;R5;ASP
POS=1 10241 rs960927773 DDX11L1:100287102;R5;ASP

POSIXly 버전은 다음과 같습니다.

sed 's/^\([^ ]* \)\([^ ]* \)\([^ ]* \)POS=.*;GINFO=/\1\2\3/' infile

답변3

POSIXly sed에서는 다음을 수행할 수 있습니다.

sed -ne '
   #place a markholder at the beginning of the 4th field
   s/[^[:blank:]][[:blank:]]\{1,\}/&\
/3

   # perform the sub on the 4th field
   s/\nPOS=.*;GINFO=//p
'  input_file

관련 정보