두 개의 파일이 있습니다.
파일 1(검색):
1
GACGGAGGATGCAAGTGTTATCCGGAATCACTGGGCGTAAAGTTTTTTTTT
2
GACGGAGGATGCAAGTGTTATCCGGAAT
3
GACGGAGGATGCAAGTGTTATCCGGAATCACTGGGCGTAAAGCGTCC
4
GACGGAGGATGCAAGTGTTATCCGGAATCACTGGGCCGTCCGTAG
파일 2(모드):
GACGGAGGATGCAAGTGTTATCCGGAATCACTGGGCGTAAAGC
GACGGAGGATGCAAGTGTTATCCGGAATCACTGGGCGTAAAGCG
GACGGAGGATGCAAGTGTTATCCGGAATCACTGGGCGTAAAGCGTCC
GACGGAGGATGCAAGTGTTATCCGGAATCACTGGGCGTAAAGCGTCCGTAG
나에게 필요한 것은:
1
GACGGAGGATGCAAGTGTTATCCGGAATCACTGGGCGTAAAGTTTTTTTTT
2
3
4
GACGGAGGATGCAAGTGTTATCCGGAATCACTGGGCCGTCCGTAG
즉, 패턴 파일에서 검색 라인을 검색하는 스크립트가 필요하며, 검색 라인을 완전히 또는 부분적으로 찾을 수 있는 경우("2" 이후 라인의 경우) 해당 검색 라인을 작성해서는 안 되고 파일의 다른 모든 라인은 작성해야 합니다. 1.
이 포럼에서 찾은 많은 grep 및 awk 스크립트를 시도했지만 내 요구 사항을 충족하는 스크립트는 없습니다.
awk 'FN==NR {exclude[$0];next} !($0 in exclude)' file2 file1
또는
awk 'NR==FNR{a[$1]++;next} !($1 in a) {print $1} {next}' file2 file1
나는 또한 grep을 시도했다.
어쨌든, 내가 시도한 모든 스크립트는 부분 일치가 아닌 패턴과 정확히 일치하는 것을 찾았습니다.
누구든지 어떤 아이디어가 있습니까?
답변1
awk
스크립트 사용 :
NR == FNR { seq[++n] = $1; next }
{
header = $0
getline
for (i = 1; i <= n; ++i) {
if (match(seq[i], $0) > 0) {
print header
next
}
}
print header
print
}
실행하세요:
$ awk -f script.awk file2 file1
1
GACGGAGGATGCAAGTGTTATCCGGAATCACTGGGCGTAAAGTTTTTTTTT
2
3
4
GACGGAGGATGCAAGTGTTATCCGGAATCACTGGGCCGTCCGTAG
스크립트는 먼저 file2
배열 에서 2000개의 시퀀스를 읽은 seq
다음 배열에서 헤더를 읽은 다음 ( 사용하여 ) file1
에서 시퀀스를 읽습니다 . 그런 다음 배열을 반복하여 현재 시퀀스가 포함된 시퀀스를 찾습니다 . 그러한 시퀀스가 발견되면 헤더가 인쇄되고 스크립트는 실행 중인 다음 줄에서 계속됩니다 . 그렇지 않으면 제목과 순서가 인쇄됩니다.file1
getline
seq
file1
file1
스크립트에는 file1
헤더와 시퀀스 라인이 교대로 포함되어 있는 것으로 간주되며 여러 줄의 시퀀스는 포함되지 않습니다.
다음은 동일한 스크립트이지만 DRY 원칙("반복하지 마십시오")을 사용합니다.
NR == FNR { seq[++n] = $1; next }
{
header = $0
getline
found = 0
for (i = 1; i <= n; ++i) {
if (match(seq[i], $0) > 0) {
found = 1
break
}
}
print header
if (!found) print
}
답변2
awk
+grep
해결책:
awk '/^[^>0-9]/{
m = ""; cmd = sprintf("grep -m1 %s file2", $0);
cmd | getline m; close(cmd);
if (m) next;
}1' file1
cmd
- 주요grep
명령m
- 가능한 일치 항목으로 채워진 변수
산출:
1
GACGGAGGATGCAAGTGTTATCCGGAATCACTGGGCGTAAAGTTTTTTTTT
2
3
4
GACGGAGGATGCAAGTGTTATCCGGAATCACTGGGCCGTCCGTAG
답변3
grep -vxf <(grep -of file_1 file_2 | sort -u) file_1
파일 1
1
GACGGAGGATGCAAGTGTTATCCGGAATCACTGGGCGTAAAGTTTTTTTTT
2
GACGGAGGATGCAAGTGTTATCCGGAAT
3
GACGGAGGATGCAAGTGTTATCCGGAATCACTGGGCGTAAAGCGTCC
4
GACGGAGGATGCAAGTGTTATCCGGAATCACTGGGCCGTCCGTAG
파일_2
GACGGAGGATGCAAGTGTTATCCGGAATCACTGGGCGTAAAGC
GACGGAGGATGCAAGTGTTATCCGGAATCACTGGGCGTAAAGCG
GACGGAGGATGCAAGTGTTATCCGGAATCACTGGGCGTAAAGCGTCC
GACGGAGGATGCAAGTGTTATCCGGAATCACTGGGCGTAAAGCGTCCGTAG
산출
1
GACGGAGGATGCAAGTGTTATCCGGAATCACTGGGCGTAAAGTTTTTTTTT
2
3
4
GACGGAGGATGCAAGTGTTATCCGGAATCACTGGGCCGTCCGTAG