입력하다:
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를 설정합니다 .TAB
TAB
{if ($3~/PT~/) sub(/.*PT~/, "", $3); else $3="NA"; print}
: 레코드의 세 번째 필드( )가$3
정규식( )과 일치하는 경우(즉, 정규식을 포함하는 경우) 정규식( )의 첫 번째 가장 왼쪽에서 가장 넓은 일치 항목( )을 대체합니다. 하위 문자열) 레코드()의 세 번째 필드()에 빈 문자열()을 추가하고, 그렇지 않으면 세 번째 필드()를 문자열()로 설정하고 레코드를 인쇄합니다.~
PT~
/PT~/
sub()
/.*PT~/
/.*PT~/
PT~
""
$3
$3
NA
"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