열에서 문자열의 일부를 추출하고 다른 열은 유지합니다.

열에서 문자열의 일부를 추출하고 다른 열은 유지합니다.

다음과 같은 많은 줄이 포함된 탭으로 구분된 파일이 있습니다.

1    ILM-rs199    info1    info2    info3
2    aws-rs2778   info4    info5    info6
3    345-678945   info7    info8    info9
4    aws-rs789    info10   info11   info-rs789

두 번째와 네 번째 열을 추출하고 싶습니다. 두 번째 열에서는 다음과 같이 rs로 시작하는 문자열과 그 뒤의 숫자만 원합니다.

rs199    info2
rs2778   info5
rs789    info11

다음을 사용하여 두 번째 열만 추출할 수 있었습니다.

egrep -o 'rs[0-9]*' filename

주어진

rs199 
rs2778
rs789

하지만 다른 열도 유지해야 할 때 막혔습니다.

awk에서 egrep을 사용하려고 하는데(두 번째 열의 rs 번호를 추출하기 위해) 완료할 수 없습니다.

답변1

$ # assuming `rs[digits]` string will match only in 2nd column
$ # string matched within () will get printed
$ perl -lne 'print /(rs\d+\t)[^\t]+\t([^\t]+)/' ip.txt
rs199   info2
rs2778  info5

$ # to match from 2nd column only
$ perl -lne 'print /^[^\t]+\t[^\t]*(rs\d+\t)[^\t]+\t([^\t]+)/' ip.txt
rs199   info2
rs2778  info5

$ # to get some other column, say 2nd and 5th
$ perl -lne 'print /^[^\t]+\t[^\t]*(rs\d+\t)(?:[^\t]+\t){2}([^\t]+)/' ip.txt
rs199   info3
rs2778  info6

일치하는 항목이 있는 경우에만 인쇄합니다.

$ perl -lne '/^[^\t]+\t[^\t]*(rs\d+\t)(?:[^\t]+\t){1}([^\t]+)/ && print $1,$2' ip.txt
rs199   info2
rs2778  info5
$ perl -lne '/^[^\t]+\t[^\t]*(rs\d+\t)(?:[^\t]+\t){2}([^\t]+)/ && print $1,$2' ip.txt
rs199   info3
rs2778  info6


추출할 문자열이 서로 인접해 있는 이전 솔루션

$ # assuming the shell being used supports $'' strings
$ grep -o $'rs[0-9]*\t[^\t]*' ip.txt
rs199   info1
rs2778  info4

답변2

다음은 몇 가지 옵션입니다.

  1. $ awk -vOFS="\t" '{sub(/.*-/,"",$2);print $2,$4}' file 
    rs199   info1
    rs2778  info3
    

    이렇게 하면 두 번째 필드의 첫 번째 필드 앞의 모든 내용이 삭제 -되고 결과 두 번째 및 네 번째 필드가 인쇄됩니다.

  2. 진주

    $ perl -pe 's/.*?-*(rs\d+\t)\S+\t(\S+).*/$1\t$2/' file 
    rs199   info2
    rs2778  info5
    

    위에서 언급한 것처럼 첫 번째 필드에 해당 항목을 포함 할 수 있으면 rs실패합니다 . 보다 강력한 접근 방식은 다음과 같습니다.

    $ perl -F'\t' -lane '$F[1]=~s/.+-//; print join "\t",@F[1,3]' file
    rs199   info2
    rs2778  info5
    

    그러면 두 번째 필드의 모든 이전 문자가 제거되고 -(두 번째 필드에 문자가 없으면 아무 작업도 수행되지 않음 -) 두 번째 및 네 번째 필드가 인쇄됩니다.

답변3

나는 다음 방법으로 그것을했다

입력 파일

ILM-rs199    info1    info2    info3
aws-rs2778   info4    info5    info6
345-678945   info7    info8    info9
aws-rs789    info10   info11   info-rs789

주문하다

awk -F "-" '{print $1,$2,$3,$4,$5}' inputfile | awk '$2 ~ /^rs[0-9]/{print $2,$4}'

산출

rs199 info2
rs2778 info5
rs789 info11

관련 정보