samtools常用命令詳解

samtools是一個用于操作sam和bam文件的工具集合。

1. view

view命令的主要功能是:將輸入文件轉(zhuǎn)換成輸出文件,通常是將比對后的sam文件轉(zhuǎn)換為bam文件,然后對bam文件進行各種操作,比如數(shù)據(jù)的排序(和提取(這些操作是對bam文件進行的,因而當輸入為sam文件的時候,不能進行該操作)。

bam文件優(yōu)點:
(1)bam文件為二進制文件,占用的磁盤空間比sam文本文件?。?br> (2)利用bam二進制文件的運算速度快。

view命令中,對sam文件頭部的輸入(-t-T)和輸出(-h)是單獨的一些參數(shù)來控制的。

Usage: samtools view [options] <in.bam>|<in.sam> [region1 [...]]

默認情況下不加 region,則是輸出所有的 region.

Options:
  -b output BAM
    默認下輸出是 SAM 格式文件,該參數(shù)設置輸出 BAM 格式
  -h print header for the SAM output
    默認下輸出的 sam 格式文件不帶 header,該參數(shù)設定輸出sam文件時帶 header 信息
  -H print header only (no alignments)
  -S input is SAM
    默認下輸入是 BAM 文件,若是輸入是 SAM 文件,則最好加該參數(shù),否則有時候會報錯。
  -u uncompressed BAM output (force -b)
    該參數(shù)的使用需要有-b參數(shù),能節(jié)約時間,但是需要更多磁盤空間。
  -c Instead of printing the alignments, only count them and print the total number. All filter options, such as ‘-f’, ‘-F’ and ‘-q’ , are taken into account.
  -1 fast compression (force -b)
  -x output FLAG in HEX (samtools-C specific)
  -X output FLAG in string (samtools-C specific)
  -c print only the count of matching records
  -L FILE output alignments overlapping the input BED FILE [null]
  -t FILE list of reference names and lengths (force -S) [null]
    使用一個list文件來作為header的輸入
  -T FILE reference sequence file (force -S) [null]
    使用序列fasta文件作為header的輸入
  -o FILE output file name [stdout]
  -R FILE list of read groups to be outputted [null]
  -f INT required flag, 0 for unset [0]
  -F INT filtering flag, 0 for unset [0]
    Skip alignments with bits present in INT [0]
    數(shù)字4代表該序列沒有比對到參考序列上
    數(shù)字8代表該序列的mate序列沒有比對到參考序列上
  -q INT minimum mapping quality [0]
  -l STR only output reads in library STR [null]
  -r STR only output reads in read group STR [null]
  -s FLOAT fraction of templates to subsample; integer part as seed [-1]
  -? longer help</pre>

如果沒有指定option和region選項,則會在屏幕中顯示sam格式的文件,如下所示。

例子:
(1)將sam文件和bam文件相互轉(zhuǎn)換。注意:沒有header的sam文件不能轉(zhuǎn)換成bam文件。

$ samtools view -bS lane.sam > lane.bam
$ samtools view -b -S lane.bam -o  lane.sam

samtools view -h NA12878.bam >NA12878_2.sam

(2)提取比對到參考序列上的比對結(jié)果 F

$ samtools view -bF 4 lane.bam > lane.F.bam

(3)提取paired reads中兩條reads都比對到參考序列上的比對結(jié)果,只需要把兩個4+8的值12作為過濾參數(shù)即可

$ samtools view -bF 12 lane.bam > lane.F12.bam

(4)提取沒有比對到參考序列上的比對結(jié)果 f

$ samtools view -bf 4 lane.bam > lane.f.bam

(5)提取paired reads中比對到參考基因組上的數(shù)據(jù)

$ samtools view -b -F 4 -f 8 lane.sam > only.read1.mapped.bam
$ samtools view -b -F 8 -f 4 lane.sam > only.read2.mapped.bam
$ samtools view -b -F 12 lane.sam > all.mapped.read1.read2.bam

(6)提取bam文件中比對到caffold1上的比對結(jié)果,并保存到sam文件格式

$ samtools view lane.bam scaffold1 > scaffold1.sam

(7)提取scaffold1上能比對到30k到100k區(qū)域的比對結(jié)果

$ samtools view lane.bam scaffold1:30000-100000 $gt; scaffold1_30k-100k.sam

(8)根據(jù)fasta文件,將 header 加入到 sam 或 bam 文件中

$ samtools view -T genome.fasta -h scaffold1.sam > scaffold1.h.sam

(9)sam 和 bam 格式轉(zhuǎn)換

#BAM轉(zhuǎn)換為SAM
$ samtools view -h -o out.sam out.bam 

#SAM轉(zhuǎn)換為BAM
$ samtools view -bS out.sam >out.bam

-b 意思使輸出使BAM format
-S 意思使輸入使SAM,如果@SQ 缺剩, 要寫-t 所以如果沒有@SQ

samtools faidx ref.fa
samtools view -bt ref.fa.fai out.sam > out.bam

2. sort

對bam文件進行排序,不能對sam文件進行排序。以leftmost coordinates的方式對比對結(jié)果進行排序,或者使用-n參數(shù)以read名稱進行排序。將會添加適當?shù)腀HD-SO排序順序標頭標簽或者如果有必要的話,將會更新現(xiàn)存的一個排序順序標頭標簽。sort命令的輸出默認是標準輸出寫入,或者使用-o參數(shù)時,指定bam文件輸出名。sort命令還會在內(nèi)存不足時創(chuàng)建臨時文件tmpprefix.%d.bam

Usage: samtools sort [-l level] [-m maxMem] [-o out.bam] [-O format] [-n] [-T tmpprefix] [-@ threads] [in.sam|in.bam|in.cram]

Options:
  -m 設置每個線程運行時的內(nèi)存大小,可以使用K,M和G表示內(nèi)存大小。默認下是 500,000,000 即500M。對于處理大數(shù)據(jù)時,如果內(nèi)存夠用,則設置大點的值,以節(jié)約時間。
  -n 設置按照read名稱進行排序。默認下是按序列在fasta文件中的順序(即header)和序列從左往右的位點排序。
  -l INT 設置輸出文件壓縮等級。0-9,0是不壓縮,9是壓縮等級最高。不設置此參數(shù)時,使用默認壓縮等級;
  -o FILE 設置最終排序后的輸出文件名;
  -O FORMAT 設置最終輸出的文件格式,可以是bam,sam或者cram,默認為bam;
  -T PREFIX 設置臨時文件的前綴;
  -@ INT 設置排序和壓縮是的線程數(shù)量,默認是單線程。

例子:

$ samtools sort abc.bam abc.sort    #注意 abc.sort 是輸出文件的前綴,實際輸出是 abc.sort.bam
$ samtools view abc.sort.bam | less -S

$ samtools sort -l 9 -m 90M -o abc.sorted.bam -T sorted -@ 2 abc.bam 

3.merge

當有多個樣本的bam文件時,可以使用samtools的merge命令將這些bam文件進行合并為一個bam文件。。Merge命令將多個已經(jīng)排序后的bam文件合并成為一個排序的且保持所有輸入記錄并保持現(xiàn)有排序順序的bam文件。

Usage:   samtools merge [-nur1f] [-h inh.sam] [-R reg] [-b <list>] <out.bam> <in1.bam> [<in2.bam><in3.bam>…<inN.bam]

Options:
  -1 指定壓縮等級;
  -b FILE 輸入文件列表,一個文件一行;
  -f overwrite the output BAM if exist 強制覆蓋同名輸出文件;
  -h FILE copy the header in FILE to <out.bam> [in1.bam]。 指定FILE內(nèi)的’@’頭復制到輸出bam文件中并替換輸出文件的文件頭。否則,輸出文件的文件頭將從第一個輸入文件復制過來;
  -n sort by read names。設定輸入比對文件是以read名進行排序的而不是以染色體坐標排序的;
  -R STR merge file in the specified region STR [all]。合并輸入文件的指定區(qū)域;
  -r attach RG tag (inferred from file names)。使RG標簽添加到每一個比對文件上,標簽值來自文件名;
  -u uncompressed BAM output。輸出的bam文件不壓縮;
  -c 當多個輸入文件包含相同的@RG頭ID時,只保留第一個到合并后輸出的文件。當合并多個相同樣本的不同文件時,非常有用。
  -p 與-c參數(shù)類似,對于要合并的每一個文件中的@PG ID只保留第一個文件中的@PG。
例子

#合并test_L1.bam和test_L2.bam文件
$ samtools merge -h test.sam \
      test_L1_L2.bam \
      test_L1.sorted.bam \
      test_L2.sroted.bam

#合并test_L1.bam和test_L2.bam文件中的指定區(qū)域chr7
$ samtools merge -h test.sam \
      -R chr7
      test_L1_L2.bam \
      test_L1.sorted.bam \
      test_L2.sroted.bam

Note: Samtools' merge does not reconstruct the @RG dictionary in the header. Users must provide the correct header with -h, or uses Picard which properly maintains the header dictionary in merging.

4.index

為了能夠快速訪問bam文件,可以為已經(jīng)基于坐標排序后bam或者cram的文件創(chuàng)建索引,生成以.bai或者.crai為后綴的索引文件。必須使用排序后的文件,否則可能會報錯。另外,不能對sam文件使用此命令。如果想對sam文件建立索引,那么可以使用tabix命令創(chuàng)建。

Usage: samtools index [-bc] [-m INT] aln.bam |aln.cram [out.index]

Options:
  -b 創(chuàng)建bai索引文件,未指定輸出格式時,此參數(shù)為默認參數(shù);
  -c 創(chuàng)建csi索引文件,默認情況下,索引的最小間隔值為2^14,與bai格式一致;
  -m INT 創(chuàng)建csi索引文件,最小間隔值2^INT;

例子:

#創(chuàng)建bai索引
$ samtools index test_2.sorted.bam
$ smatools index -b test_2.sorted.bam
#創(chuàng)建csi索引
$ samtools index -c test_2.sorted.bam
$ samtools index -c -m 10 test_2.sorted.bam

以下兩種命令結(jié)果一樣

$ samtools index abc.sort.bam
$ samtools index abc.sort.bam abc.sort.bam.bai

5. faidx

對fasta文件建立索引,生成的索引文件以.fai后綴結(jié)尾。該命令也能依據(jù)索引文件快速提取fasta文件中的某一條(子)序列.如果沒有指定區(qū)域,faidx命令就創(chuàng)建文件索引并生成后綴為.fai的索引文件。如果指定區(qū)域,那么就是生產(chǎn)并顯示fasta格式的子序列。輸入文件可以使BGZF壓縮格式的文件。

輸入文件中的序列要有不同的名稱。如果不是這樣,即存在相同名稱的序列,在建立索引的過程中將發(fā)出有關重復序列的警告而且生產(chǎn)的同名子序列的信息都要被第一個同名子序列的信息覆蓋。

Usage:  samtools faidx <ref.fasta> [region1,…]

例:對基因組文件建立索引

$ samtools faidx genome.fasta

上圖中先顯示了待處理的test.fasta文件的內(nèi)容,由4個長度不一的序列組成,其中前兩個重名。然后使用faidx命令進行處理。最后在顯示生產(chǎn)索引文件test.fasta.fai的內(nèi)容。

生成了索引文件fasta.fai,是一個文本文件,分成了5列。

  • 第1列是子序列的名稱,每個序列”>”之后到第一個空格之前的所有字符;
  • 第2列是序列長度,單位為bp;
  • 第3列是OFFSET,第一個堿基的偏移量,以0為起始值。序列所在的位置”,因為該數(shù)字從上往下逐漸變大,最后的數(shù)字是genome.fasta文件的大小;
  • 第4列LINEBASES,除了最后一行以外,其他代表序列的堿基數(shù),單位為bp;
  • 第5列行寬(LINEWIDTH),除了最后一行以外,其他代表序列的長度,包括換行符。注:windows系統(tǒng)中換行符為\r\n,要在序列長度的基礎上加2。

于是通過此文件,可以定位子序列在fasta文件在磁盤上的存放位置,直接快速調(diào)出子序列。

由于有索引文件,可以使用以下命令很快從基因組中提取到fasta格式的子序列

$ samtools faidx genome.fasta scffold_10 > scaffold_10.fasta

提取序列如下圖:

6. tview

tview能直觀的顯示出reads比對基因組的情況,和基因組瀏覽器有點類似。

Usage: samtools tview <aln.bam> [ref.fasta]

當給出參考基因組的時候,會在第一排顯示參考基因組的序列,否則,第一排全用N表示。
按下 g ,則提示輸入要到達基因組的某一個位點。例子“scaffold_10:1000"表示到達第10號scaffold的第1000個堿基位點處。
使用H(左)J(上)K(下)L(右)移動顯示界面。大寫字母移動快,小寫字母移動慢。
使用空格建向左快速移動(和 L 類似),使用Backspace鍵向左快速移動(和 H 類似)。
Ctrl+H 向左移動1kb堿基距離; Ctrl+L 向右移動1kb堿基距離
可以用顏色標注比對質(zhì)量,堿基質(zhì)量,核苷酸等。30~40的堿基質(zhì)量或比對質(zhì)量使用白色表示;20~30黃色;10~20綠色;0~10藍色。
使用點號'.'切換顯示堿基和點號;使用r切換顯示read name等
還有很多其它的使用說明,具體按 ? 鍵來查看。

7. flagstat

統(tǒng)計輸入文件的相關數(shù)據(jù)并將這些數(shù)據(jù)輸出至屏幕顯示。每一項統(tǒng)計數(shù)據(jù)都由兩部分組成,分別是QC pass和QC failed,表示通過QC的reads數(shù)據(jù)量和未通過QC的reads數(shù)量。以“PASS + FAILED”格式顯示。

Usage: samtools flagstat <in.bam> |<in.sam> | <in.cram>

例如

4835105 + 0 in total (QC-passed reads + QC-failed reads)    # QC pass的reads的數(shù)量為4835105 ,未通過QC的reads數(shù)量為0,意味著總reads數(shù)為4835105條;
529 + 0 secondary
0 + 0 supplementary
0 + 0 duplicates                    # 重復reads的數(shù)量,QC pass和failed
4719540 + 0 mapped (97.61% : N/A)   # 比對到參考基因組上的reads數(shù)量(總體上,reads的匹配率);
4834576 + 0 paired in sequencing    # paired reads數(shù)據(jù)數(shù)量(有多少reads是屬于paired reads)
2417288 + 0 read1                   # read1的數(shù)量;
2417288 + 0 read2                   # read2 的數(shù)量;
4698524 + 0 properly paired (97.19% : N/A)     # 完美匹配的reads數(shù):比對到同一條參考序列,并且兩條reads之間的距離符合設置的閾值;
4718936 + 0 with itself and mate mapped        # 一對reads都比對到了參考序列上的reads數(shù),但是并不一定比對到同一條染色體上;
75 + 0 singletons (0.00% : N/A)                # 一對reads中只有一條與參考序列相匹配的reads數(shù),和上一個相加,則是總的匹配上的;
10646 + 0 with mate mapped to a different chr  # 一對reads比對到不同染色體的reads數(shù);
10414 + 0 with mate mapped to a different chr (mapQ>=5)  #  一對reads比對到不同染色體的且比對質(zhì)量值大于5的reads數(shù);

7. depth

得到每個堿基位點或者區(qū)域的測序深度,并輸出到標準輸出。depth命令計算每一個位點的測序深度并在標準顯示設備中顯示。注意:使用此命令之前必須先samtools index。

Usage: samtools depth [options] [in1.bam|in1.sam|in1.cram[in2.bam|in2.sam|in2.cram]…]

Options:
  -a 輸出所有位點,包括零深度的位點;-a –a,--aa 完全輸出所有位點,包括未使用到的參考序列;
  -b FILE 計算BED文件中指定位置或區(qū)域的深度;
  -f FiLE 使用在FILE中的指定bam文件;
  -I INT 忽略掉小于此INT值的reads;
  -q INT 只計算堿基質(zhì)量值大于此值的reads;
  -Q INT 只計算比對質(zhì)量值大于此值的reads;
  -r CHR:FROM –TO 只計算指定區(qū)域的reads,后面跟染色體號(region)

示例:

$ samtools depth in.bam  >  out.depth.txt

注意: in.bam 必須經(jīng)過了排序。
depth命令運行如下圖所示:

一共得到3列以指標分隔符分隔的數(shù)據(jù),第一列為染色體名稱,第二列為位點,第三列為覆蓋深度。

8. mpileup

該命令用于生成bcf文件,再使用bcftools進行SNP和Indel的分析。bcftools是samtool中附帶的軟件,在samtools的安裝文件夾中可以找到。

Usage: samtools mpileup [-EBug] [-C *capQcoef*] [-r *reg*] [-f *in.fa*] [-l *list*] [-M *capMapQ*] [-Q *minBaseQ*] [-q *minMapQ*] *in.bam* [*in2.bam* [*...*]]

Options:
  -f–來輸入有索引文件的fasta參考序列;
  -F –gap-frac FLOAT 含有間隔reads的最小片段。
  -l –positions FILE BED文件或者包含區(qū)域位點的位置列表文件。位置文件包含兩列,染色體和位置,從1開始計數(shù)。BED文件至少包含3列,染色體、開始位置和結(jié)束位置,開始端從0開始計數(shù)。
  -r –region STR 只在指定區(qū)域產(chǎn)生pileup,需要已建立索引的bam文件。通常和-l參數(shù)一起使用。
  -o –output FILE 生成pileup格式文件或者VCF、BCF文件而不是默認的標準輸出。
  -g –BCF 計算基因型的似然值和輸出文件格式為BCF。
  -v –VCF 計算基因型的似然值和輸出文件格式為VCF。
  -C --adjust-MQ INT 用于降低比對質(zhì)量的系數(shù),如果reads中含有過多的錯配。不能設置為零。BWA推薦值為50。
  -A --count-orphans 在檢測變異中,不忽略異常的reads對。
  -D –輸出每個樣本的reads深度。
  -V –輸出每個樣本未比對到參考基因組的reads數(shù)量。
  -t –output-tags LIST設置FORMAT和INFO的列表內(nèi)容,以逗號分割。
  -u –uncompressed 生成未壓縮的VCF和BCF文件。
  -I –skip-indel 不檢測INDEL。
  -m –min-ireads INT 候選INDEL的最小間隔的reads。

下面是一個使用-r參數(shù)和-l參數(shù)生成vcf文件的實例:

$ echo "SamtoolsMpileupByChr Begin: " `date` && \
samtools mpileup \
      -l chr25Region.bed \
      -r 7 \
      -q 1 \
      -C 50 \
      -t DP,DV \
      -m 2 \
      -F 0.002 \
      -uvf \
      human.fasta \
      test_3.bam \
      --output test_3.chr7.raw.vcf && \
echo "SamtoolsMpileupByChr End: " `date`
$ samtools mpileup -f genome.fasta abc.bam > abc.txt
$ samtools mpileup -gSDf genome.fasta abc.bam > abc.bcf
$ samtools mpileup -guSDf genome.fasta abc.bam | bcftools view -cvNg - > abc.vcf

mpileup不使用-u或-g參數(shù)時,則不生成二進制的bcf文件,而生成一個文本文件(輸出到標準輸出)。該文本文件統(tǒng)計了參考序列中每個堿基位點的比對情況;該文件每一行代表了參考序列中某一個堿基位點的比對結(jié)果。比如:

scaffold_1      2841    A       11      ,,,...,....     BHIGDGIJ?FF
scaffold_1      2842    C       12      ,$,,...,....^I. CFGEGEGGCFF+
scaffold_1      2843    G       11      ,,...,.....     FDDDDCD?DD+
scaffold_1      2844    G       11      ,,...,.....     FA?AAAA<AA+
scaffold_1      2845    G       11      ,,...,.....     F656666166*
scaffold_1      2846    A       11      ,,...,.....     (1.1111)11*
scaffold_1      2847    A       11      ,,+9acggtgaag.+9ACGGTGAAT.+9ACGGTGAAG.+9ACGGTGAAG,+9acggtgaag.+9ACGGTGAAG.+9ACGGTGAAG.+9ACGGTGAAG.+9ACGGTGAAG.+9ACGGTGAAG       %.+....-..)
scaffold_1      2848    N       11      agGGGgGGGGG     !!$!!!!!!!!
scaffold_1      2849    A       11      c$,...,.....    !0000000000
scaffold_1      2850    A       10      ,...,.....      353333333

mpileup生成的結(jié)果包含6行:參考序列名;位置;參考堿基;比對上的reads數(shù);比對情況;比對上的堿基的質(zhì)量。

其中第5列比較復雜,解釋如下:

  • .代表與參考序列正鏈匹配。
  • ,代表與參考序列負鏈匹配。
  • ATCGN代表在正鏈上的不匹配。
  • atcgn代表在負鏈上的不匹配。
  • *代表模糊堿基
  • ^代表匹配的堿基是一個read的開始;’^'后面緊跟的ascii碼減去33代表比對質(zhì)量;這兩個符號修飾的是后面的堿基,其后緊跟的堿基(.,ATCGatcgNn)代表該read的第一個堿基。
  • $代表一個read的結(jié)束,該符號修飾的是其前面的堿基。
  • 正則式\+[0-9]+[ACGTNacgtn]+代表在該位點后插入的堿基;比如上例中在scaffold_1的2847后插入了9個長度的堿基acggtgaag。表明此處極可能是indel。
  • 正則式-[0-9]+[ACGTNacgtn]+代表在該位點后缺失的堿基;

9. samtools rmdup

NGS上機測序前需要進行PCR一步,使一個模板擴增出一簇,從而在上機測序的時候表現(xiàn)出為1個點,即一個reads。若一個模板擴增出了多簇,結(jié)果得到了多個reads,這些reads的坐標(coordinates)是相近的。在進行了reads比對后需要將這些由PCR duplicates獲得的reads去掉,并只保留最高比對質(zhì)量的read。使用rmdup命令即可完成.

Usage:  samtools rmdup [-sS]  

Options:
  -s 對single-end reads。默認情況下,只對paired-end reads
  -S 將Paired-end reads作為single-end reads處理。

10.samtools idxstats

檢索和打印已建立索引的bam文件的統(tǒng)計數(shù)據(jù),包括參考序列名稱、序列長度、比對上的read數(shù)量和未比對上的read數(shù)量。輸出結(jié)果顯示在屏幕上,以制表符分割。

Usage:  samtools idxstats  <in.bam>

如下圖所示:


idxstats 統(tǒng)計一個表格,4列,分別為”序列名,序列長度,比對上的reads數(shù),unmapped reads number”。第4列應該是paired reads中有一端能匹配到該scaffold上,而另外一端不匹配到任何scaffolds上的reads數(shù)。

11. samtools bedcov

計算由BED文件指定的基因組區(qū)域內(nèi)的總堿基數(shù)量。

Usage:  samtools bedcovregion.bed <in.bam | in.sam | in.cram>

如下圖所示:

12. 其它有用的命令

reheader 替換bam文件的頭

Usage:samtools reheader <in.header.sam> <in.bam>

cat 連接多個bam文件,適用于非sorted的bam文件

Usage:samtools cat [-h header.sam] [-o out.bam] <in1.bam> <in2.bam> [ ... ]</pre>

13. 將bam文件轉(zhuǎn)換為fastq文件

有時候,我們需要提取出比對到一段參考序列的reads,進行小范圍的分析,以利于debug等。這時需要將bam或sam文件轉(zhuǎn)換為fastq格式。
該網(wǎng)站提供了一個bam轉(zhuǎn)換為fastq的程序:http://www.hudsonalpha.org/gsl/information/software/bam2fastq

$ wget http://www.hudsonalpha.org/gsl/static/software/bam2fastq-1.1.0.tgz
$ tar zxf bam2fastq-1.1.0.tgz
$ cd bam2fastq-1.1.0
$ make
$ ./bam2fastq <in.bam>

使用示例

1:從bam中過濾掉沒有比對上的信息,并將比對上的部分保存到sam中

samtools view -F 4 xxx.bam >xxx.mapped.sam

2:從bam中過濾沒有比對上的信息,并保存到bam中:(要加-h,表示輸出header)

samtools view -F 4 -h xxx.bam |samtools view -h -o xxx.mapped.bam -

注意:雖然有些沒有比對上的結(jié)果 的flag值是141,77等,但是都可以用4過濾掉。

image

3:提取為fastq:主要參數(shù)為-f,-F,-G三個。
提取沒有比對上的信息到fastq用:

samtools fastq -f 4 xxx.bam > xxx.unmapped.fastq

提取比對上的reads到fastq用

samtools fastq -F 4 xxx.bam > xxx.mapped.fastq

REF:
https://www.plob.org/article/7112.html
http://www.chenlianfu.com/?p=1399
http://en.wikipedia.org/wiki/SAMtools
http://www.htslib.org/doc/samtools-1.1.html
http://sourceforge.net/projects/samtools/files/
http://samtools.sourceforge.net/samtools.shtml
https://www.cnblogs.com/emanlee/p/4316581.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容