한 줄에 여러 개의 정렬되지 않은 내용이 포함된 파일이 있는데 이를 새 파일에 넣고 싶습니다. 다음은 제가 가지고 있는 부분 파일의 예입니다.
X1314448: SaMi|SM_g2554.t1 SaMi|SM_g5072.t1 Des|Des_g3808.t1 Dul|Dul_comp50786_c0_seq1-1 Nig|Nig_comp88811_c0_seq2-1 AB|AB0003DMP400018076_AB0003DMT400026495 Phy|Phy_comp35647_c0_seq1-1 SWtf|SW_g27807.t1 Tom|Solyc02g077050.2.1
X1314810: Des|Des_g33587.t1 Nig|Nig_comp84357_c0_seq1-1 AB|AB0003DMP400020961_AB0003DMT400030857 Phy|Phy_comp33112_c0_seq1-1 SaMi|SM_g27352.t1 SWtf|SW_g21774.t1 TAIR|AT4G14930.1 Tom|Solyc06g054250.2.1 Dul|Dul_comp63657_c0_seq2-1
X1327159: AB|AB0003DMP400016823_AB0003DMT400024599 AB|AB0003DMP400017933_AB0003DMT400026257 Dul|Dul_comp58749_c0_seq2-1
X1330513: Des|Des_g36886.t1 AB|AB0003DMP400049952_AB0003DMT400073802 SWtf|SW_g16502.t1
X132738: Des|Des_g491.t1 Des|Des_g6171.t1 Dul|Dul_comp57659_c0_seq2-1 Dul|Dul_comp57659_c0_seq3-1 Dul|Dul_comp57659_c0_seq4-1 Ni g|Nig_comp93106_c3_seq1-1 Nig|Nig_comp93106_c3_seq2-1 AB|AB0003DMP400005485_AB0003DMT400007895 AB|AB0003DMP400021388_PGS C0003DMT400031553 Phy|Phy_comp61931_c0_seq1-1 Phy|Phy_comp61931_c0_seq2-1 Phy|Phy_comp61931_c0_seq3-1 Phy|Phy_comp61931_c0_seq4-1 RICE|LOC_Os08g43334.1 RICE|LOC_Os08g43334.2 RICE|LOC_Os09g35790.1 RICE|LOC_Os09g35790.2 SaMi|SM_g30888.t1 SaMi|SM_g5888.t1 SWtf|SW _g17547.t1 SWtf|SW_g33717.t1 Des|Des_g47565.t1 SaMi|SM_g6027.t1 SWtf|SW_g42019.t1 TAIR|AT5G62020.1 Tom|Solyc03g026020.2.1 TAIR|AT4 G11660.1
내가 원하는 것은 첫 번째 부분인 "X1314448:"과 "Des|Des_g3808.t1"입니다. 또 다른 "Des_xxx"(어떤 경우에는 끝에서 두 번째 줄과 같이 둘 이상이 있음)가 있으면 그것도 포함하고 출력 파일에 "AB|AB00..."을 포함하고 싶습니다. 정렬되지 않은 목록 원하는 세 가지 다른 부분을 같은 줄에 유지하면서 정렬하는 방법(서로 연결되도록 만드는 방법)을 잘 모르겠습니다. 또한 하나의 항목에서 여러 일치 항목을 얻는 방법도 잘 모르겠습니다.
따라서 첫 번째 줄의 출력은 다음과 같아야 합니다.
X1314448: Des|Des_g3808.t1 AB|AB0003DMP400018076_AB0003DMT400026495
두 번째 항목의 경우:
X1330513: Des|Des_g36886.t1 AB|AB0003DMP400049952_AB0003DMT400073802
마지막 항목의 경우:
X132738: Des|Des_g491.t1 Des|Des_g6171.t1 Des|Des_g47565.t1 AB|AB0003DMP400005485_AB0003DMT400007895 AB|AB0003DMP400021388_PGSC0003DMT400031553
가장 큰 문제는 마지막 줄이라고 생각합니다. 또한 "Dul|..."을 포함하도록 파일을 수정하고 싶습니다.
해결책:
몇 가지 연구 끝에 나는 다음과 같이 결론을 내렸습니다. 1 - 이 스크립트를 다른 이름으로 저장하고 FastaToTbl
실행 가능하게 만듭니다( chmod 744 FastaToTbl
).
if (substr($1,1,1)==">")
if (NR>1)
printf "\n%s\t", substr($0,2,length($0)-1)
else
printf "%s\t", substr($0,2,length($0)-1)
else
printf "%s", $0
}END{printf "\n"}' "$@"
2 - 이 스크립트를 포함하는 두 번째 파일을 만듭니다. FastaToTbl
이 스크립트와 함께 사용하여 ID file1
와 시퀀스를 추출합니다 file2
.
./mktbl file1[contains FASTA sequences] |
perl -ne 'chomp;@a=split(/\t/); $k{$a[0]}=$a[1]; ## Collect the sequences
## $k{ID}=SEQUENCE
END{open(A,"File02[contains my data that is missing FASTA sequences (ID file)]"); ## Open ID file
while(<A>){ ## and process it line by line
@a=split(/\s+/); ## Gather the IDs in array @a
print shift(@a); ## Print the first element (Jan123:)
print "$_ $k{$_}\n" for @a; ## Print each ID and its seq
}}'
답변1
awk '/^ *$/ {next;}; NR>1 {print bufline;};
{bufline=$1 " ";
for (i=2;i<=NF;i++)
{ if ($i ~ "^Des\\|" || $i ~ "^AB\\|") bufline=bufline sprintf("%s ",$i);
if ($i ~ "^Dul\\|") dul=$i;
};
};
END {print bufline " " dul;}' inputfile
답변2
이것은 당신에게 효과가 없습니다:
sort -k 2
기본적으로 정렬은 공백을 기준으로 열을 정의하므로 이 옵션을 변경할 수 있습니다 -t
. 이 경우에는 두 번째 필드를 기준으로 정렬하도록 했습니다. 언뜻 보면 귀하의 요구에 적합할 것입니다.
순차적으로 정렬하려는 경우에도 -k
정렬을 사용하여 추가 옵션을 추가할 수 있습니다. 매뉴얼 페이지에서:
-k, --key=KEYDEF sort via a key; KEYDEF gives location and type
KEYDEF는 시작 및 중지 위치를 나타내는 F[.C][OPTS][,F[.C][OPTS]]입니다. 여기서 F는 필드 번호이고 C는 필드의 문자 위치입니다. 둘 다 원점 1입니다. 정지 위치는 기본적으로 줄 끝으로 설정됩니다.
X1327159: AB|AB0003DMP400016823_AB0003DMT400024599 AB|AB0003DMP400017933_AB0003DMT400026257 Dul|Dul_comp58749_c0_seq2-1
X1314810: Des|Des_g33587.t1 Nig|Nig_comp84357_c0_seq1-1 AB|AB0003DMP400020961_AB0003DMT400030857 Phy|Phy_comp33112_c0_seq1-1 SaMi|SM_g27352.t1 SWtf|SW_g21774.t1 TAIR|AT4G14930.1 Tom|Solyc06g054250.2.1 Dul|Dul_comp63657_c0_seq2-1
X1330513: Des|Des_g36886.t1 AB|AB0003DMP400049952_AB0003DMT400073802 SWtf|SW_g16502.t1
X132738: Des|Des_g491.t1 Des|Des_g6171.t1 Dul|Dul_comp57659_c0_seq2-1 Dul|Dul_comp57659_c0_seq3-1 Dul|Dul_comp57659_c0_seq4-1 Ni