![행 이름의 일부를 샘플 이름으로 바꾸기](https://linux55.com/image/134816/%ED%96%89%20%EC%9D%B4%EB%A6%84%EC%9D%98%20%EC%9D%BC%EB%B6%80%EB%A5%BC%20%EC%83%98%ED%94%8C%20%EC%9D%B4%EB%A6%84%EC%9C%BC%EB%A1%9C%20%EB%B0%94%EA%BE%B8%EA%B8%B0.png)
p1_500sc.fasta, p2_500sc.fasta라는 이름의 여러 샘플이 있습니다. 각 파일은 다음과 같습니다.
>NODE_60_length_504_cov_1.580902
TATATCGCCGTAGATAGACGAATACGGGATTTTGAAATGACTGATATATTCAAGCACATC
CTGTTCAGTCCAAAATGACATCGGCTTCGATTTCGGGATTGCCCCCGCAAAGTTGTTACA
>NODE_61_length_503_cov_4.457447
GATATGGGCCGGTGAGCATGCTGTCACATTTTGGGCAGGTGCCGAGGATTATGAGCTCGT
CTTCCGGCGTCAACGCTTGTTCGTTGCGTCTGGTGATGTGTTCCAGAGCGGCATAGTCGT
>NODE_62_length_500_cov_4.037534
CTCGTTCTTGCACTCCTGAATGAAGCGAATCTCTGACGAGGGTATTCCATAATCCTCTAT
CAGCTTACGCTTGATTTCTG
>NODE_63_length_500_cov_1.718499
GGAGGATATCAATGCCCTTATACTGCTTCTCAACAGTAGGAGTAATGCGGATACCCAAAA
CGGTCTTAGGGTTCTCCAGCAACTTCATGGCATTCCAACGCTTCAAGTCATCCATGCGGA
AGCCTTCGGCT
보시다시피 NODE 문구가 있습니다. 각 파일에 대해 예제 이름에서 파일 지정자의 "NODE"를 변경하고 싶습니다: p1/p2/p100...pn
p1_500sc.fasta 파일의 출력은 다음과 같습니다.
>p1_60_length_504_cov_1.580902
TATATCGCCGTAGATAGACGAATACGGGATTTTGAAATGACTGATATATTCAAGCACATC
CTGTTCAGTCCAAAATGACATCGGCTTCGATTTCGGGATTGCCCCCGCAAAGTTGTTACA
>p1_61_length_503_cov_4.457447
GATATGGGCCGGTGAGCATGCTGTCACATTTTGGGCAGGTGCCGAGGATTATGAGCTCGT
CTTCCGGCGTCAACGCTTGTTCGTTGCGTCTGGTGATGTGTTCCAGAGCGGCATAGTCGT
>p1_62_length_500_cov_4.037534
CTCGTTCTTGCACTCCTGAATGAAGCGAATCTCTGACGAGGGTATTCCATAATCCTCTAT
CAGCTTACGCTTGATTTCTG
>p1_63_length_500_cov_1.718499
GGAGGATATCAATGCCCTTATACTGCTTCTCAACAGTAGGAGTAATGCGGATACCCAAAA
CGGTCTTAGGGTTCTCCAGCAACTTCATGGCATTCCAACGCTTCAAGTCATCCATGCGGA
AGCCTTCGGCT
p123_500sc.fasta 파일의 경우
>p123_2_length_456_cov_4.453333
GATATGGGCCGGTGAGCATGCTGTCACATTTTGGGCAGGTGCCGAGGATTATGAGCTCGT
CTTCCGGCGTCAACGCTTGTTCGTTGCGTCTGGTGATGTGTTCCAGAGCGGCATAGTCGT
>p123_356_length_3_cov_4.037908
CTCGTTCTTGCACTCCTGAATGAAGCGAATCTCTGACGAGGGTATTCCATAATCCTCTAT
CAGCTTACGCTTGATTTCTG
다른 샘플에서도 마찬가지입니다. 샘플은 p1에서 시작하여 p150에 도달할 수 있습니다.
답변1
bash
+sed
해결책:
for f in p[0-9]*.fasta; do
pfx="${f%%_*}"
sed -i "s/^>NODE/>$pfx/" "$f"
done
pfx="${f%%_*}"
_
- 결과를 변수에 할당 할 때까지 파일 이름의 오른쪽 부분을 자릅니다.pfx
sed -i "s/^>NODE/>$pfx/"
-부분>NODE
문자열을 변수로 대체$pfx
답변2
GNU를 사용하면 awk
단일 명령 호출로 이 작업을 수행할 수 있습니다.
gawk -i /usr/share/awk/inplace.awk -F_ -v OFS=_ '
BEGINFILE {
node = FILENAME
sub(".*/", "", node)
sub("_.*", "", node)
}
$1 == ">NODE" {$1 = ">" node}
{print}' ./p*_*.fasta
어떤 경우 에라도,사용하지 마세요-i inplace
현재 작업 디렉터리(as or)에서 확장 기능을 먼저 gawk
로드 하려고 하면 누군가가 해당 디렉터리에 악성 코드를 심었을 수 있습니다. 시스템과 함께 제공되는 확장 프로그램 의 경로 는 다를 수 있습니다. 출력을 참조하세요.inplace
inplace
inplace.awk
inplace
gawk
gawk 'BEGIN{print ENVIRON["AWKPATH"]}'
답변3
이것은 각 파일을 반복하고 파일 이름의 밑줄 앞의 모든 것을 변수에 할당한 다음 sample
파일의 >NODE
for를 다음으로 바꿉니다.$sample
sed
for file in /path/to/files/*;do
sample=$(echo "${file}" | sed s/_.*//)
sed -i "s/^>NODE/${sample}/" ${file}
done