내 파일에는 다음과 같은 줄이 포함되어 있습니다.
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}
\1
s/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