주어진 문자열이 나올 때까지 세 번째 열을 자릅니다.

주어진 문자열이 나올 때까지 세 번째 열을 자릅니다.

입력하다:

W41784094   CH60104475  lasbalsrbla bla foo bar bla PT~CH60104475
W41788464   WO60444453  hellobla bla -bla foo bar 432 alaf. PT~CH60107925
W41753387   IN61026681  sim##bla-bla bla foo bar blab lba la:bla32 bla

산출:

W41784094   CH60104455  CH60104455
W41788464   WO60444453  CH60107925
W41753387   IN61026681  NA

질문: "PT~"까지 세 번째 열을 자르는 방법은 무엇입니까?

그러나 "PT~"가 항상 존재하지 않는 경우 "NA"가 필요합니다. \

탭은 구분 기호입니다.

답변1

awk대신 ; 을 사용하여 이 작업을 수행하는 것이 더 쉽습니다 sed. awk옵션인 경우 :

< input awk 'BEGIN {FS=OFS="\t"} {if ($3~/PT~/) sub(/.*PT~/, "", $3); else $3="NA"; print}'

확장:

BEGIN {
    FS=OFS="\t"
}
{
    if ($3 ~ /PT~/)
        sub(/.*PT~/, "", $3);
    else
        $3 = "NA";
    print
}
  • BEGIN {FS=OFS="\t"}: 각각 분리된 문자열이 레코드의 필드로 간주되고( 1 ) 각 레코드 뒤에 구분 기호가 인쇄되도록( 2 ) 필드 구분 기호 1 과 출력 필드 구분 기호 2를 설정합니다 .TABTAB
  • {if ($3~/PT~/) sub(/.*PT~/, "", $3); else $3="NA"; print}: 레코드의 세 번째 필드( )가 $3정규식( )과 일치하는 경우(즉, 정규식을 포함하는 경우) 정규식( )의 첫 번째 가장 왼쪽에서 가장 넓은 일치 항목( )을 대체합니다. 하위 문자열) 레코드()의 세 번째 필드()에 빈 문자열()을 추가하고, 그렇지 않으면 세 번째 필드()를 문자열()로 설정하고 레코드를 인쇄합니다.~PT~/PT~/sub()/.*PT~//.*PT~/PT~""$3$3NA"NA"

답변2

sed -e's/\(\t.*\t\).* PT~/\1/;t' \
    -e's/\t[^\t]*/\tNA/2'        

이것은 당신에게 효과가 있을 것입니다.마지막일어난PT행의 마지막 필드에 있습니다.

또한 sed버전에 따라 다음을 사용해야 할 수도 있습니다.\t탈출하다.

요점은 한 줄에서 임의의 수의 문자로 구분된 두 개의 탭을 찾고, 그 뒤에 어떤 지점에서 문자열이 오는 경우를 찾는 것입니다.<space>PT~그런 다음 주소가 지정된 패턴 공간의 첫 번째 캡처 하위 그룹을 s///제외한 모든 하위 그룹을 대체합니다. 공평하게 말하면 이는 세 개의 필드 제한에 의존하지만 첫 번째 바꾸기 문은 다음과 같이 변경될 수 있습니다.\1\(\)//

sed -e's/^\(\([^\t]*\t\)\{2\}\)[^\t]* PT~/\1/;t' ...

...GNU 또는 BSD를 사용하여 이식 가능 sed...

sed -Ee's/^(([^\t]*\t){2})[^\t]* PT~/\1/;t' ...

...replace 문을 s///처음 3개 필드로만 명시적으로 제한합니다.

어떤 경우든 t이전 교체가 성공하면 est 분기가 중단되므로 다음 s///교체는 해당 줄의 탭으로 구분된 세 번째 필드를 일치하지 않는 필드로 교체합니다.<space>PT~문자열만 포함하는 문자열NA.

sed -e's/\(\t.*\t\).* PT~/\1/;t'  \
    -e's/\t[^\t]*/\tNA/2'       <<\IN
W41784094       CH60104475      lasbalsrbla bla foo bar bla PT~CH60104475
W41788464       WO60444453      hellobla bla -bla foo bar 432 alaf. PT~CH60107925
W41753387       IN61026681      sim##bla-bla bla foo bar blab lba la:bla32 bla
IN

W41784094       CH60104475      CH60104475
W41788464       WO60444453      CH60107925
W41753387       IN61026681      NA

관련 정보