10개의 탭으로 구분된 열이 있는 긴 데이터 목록이 있습니다. 처음 두 열은 ID입니다. 선택한 ID를 가진 행을 검색하고 싶습니다.
먼저 각 ID가 로 끝나도록 선택한 ID의 이름을 바꿉니다 comp-
. 그런 다음 선택한 ID가 열 1과 열 2 모두에 있는 행을 추출하려고 합니다.
문서:
comp-AA11232.1 GR55896.1
AB55887.1 comp-FR87559.1
comp-AC11232.1 comp-AE55888.1
comp-AC66742.1 comp-AD87559.1
원하는 출력:
comp-AC11232.1 comp-AE55888.1
comp-AC66742.1 comp-AD87559.1
을 사용하고 있습니다 sed -n '/comp\-.*\tcomp\-.*/p' file
. 출력 파일은 기준을 충족하는 모든 파일이지만 안타깝게도 동일한 기준의 일부 줄이 출력 파일에서 누락되었습니다.
여기서 무슨 일이 일어나고 있는지 잘 모르겠습니다. 어떤 아이디어가 있나요? 아니면 이 상황에서 더 나은 grep/awk/sed 접근 방식이 있습니까?
답변1
awk -F'\t' '$1 ~/^comp-/ && $2 ~/^comp-/' infile
동일하지만 매개변수에서 패턴을 전달합니다.
awk -F'\t' -v pat='comp-' '$1 ~"^" pat && $2 ~"^" pat' infile
또는 문자열 일치로 비교하고 여전히 매개변수에서 전달합니다.
awk -F'\t' -v str='comp-' 'index($1, str)==1 && index($2, str)==1' infile
당신은 또한 볼 수 있습니다패턴과 일치하는 텍스트를 찾는 방법은 무엇입니까?추가 매칭 옵션을 확인하세요.
답변2
진주
perl -MList::MoreUtils=all -F'\t' -lane '
print if all { /^comp-/ } @F[0,1];
' file
sedGNU 버전
$ sed -n '/^comp-.*\tcomp-/p' file