다음과 같은 많은 줄이 포함된 탭으로 구분된 파일이 있습니다.
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
다음은 몇 가지 옵션입니다.
앗
$ awk -vOFS="\t" '{sub(/.*-/,"",$2);print $2,$4}' file rs199 info1 rs2778 info3
이렇게 하면 두 번째 필드의 첫 번째 필드 앞의 모든 내용이 삭제
-
되고 결과 두 번째 및 네 번째 필드가 인쇄됩니다.진주
$ 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