簡體   English   中英

將大字符串拆分為子字符串

[英]split a large string into substrings

我有這個文件:

>first
GTGAAGTGCGGCACCCCGTAGGTCAGACAAGGCGGTCACGCCGCATCCGACATCCAACGCCCGAGCCGGTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACC
>second
CGGTAAT

我的預期輸出是這樣的:

>first
GTGAAGTGCGGCACCCCGTAGGTCAGACAAGGCGGTCACGCCGCATCCGACATCCAACGC
CCCGAGCCGGTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAACC
>second
CGGTAAT

說明:如果(該行以“>”開頭)打印​​; 否則,如果字符串的長度大於60,則將字符串拆分為60個子字符串。

我的想法在awk中是這樣的,但也歡迎bash解決方案:

gawk '/^>/ {print;next;} {len=length; if(len>60){DO SOMETHING HERE (LOOP?)} else {print}}'

任何幫助將不勝感激! 謝謝

您可以在BASH循環中使用內置的fold實用程序:

while read -r f; do
    [[ "$f" == '>'* ]] && echo "$f" || echo "$f" | fold -w 60
done < file

使用awk您可以執行以下操作:

$ awk '!/^>/&&length($0)%60{gsub(/.{60}/,"&\n")}1' file
>first
GTGAAGTGCGGCACCCCGTAGGTCAGACAAGGCGGTCACGCCGCATCCGACATCCAACGC
CCGAGCCGGTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAACC
>second
CGGTAAT

注意:如果您使用的是GNU awk v3.x,則添加--re-intervalawk --re-interval '..' file )。 對於GNU awk v4或更高版本以及BSD awk這不是必需的。

awk呢?

awk -v FS= 
    '{for (i=0;i<=NF/60;i++) {
          for (j=1;j<=60;j++)
               printf "%s", $(i*60 +j)
          print ""
          }
     }' file

查看輸出:

$ awk -v FS= '{for (i=0;i<=NF/60;i++) {for (j=1;j<=60;j++) printf "%s", $(i*60 +j); print ""}}' file
>first
GTGAAGTGCGGCACCCCGTAGGTCAGACAAGGCGGTCACGCCGCATCCGACATCCAACGC
CCGAGCCGGTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAACC
>second
CGGTAAT

您可以使用以下命令明確顯示>條件:

awk -v FS= '/^>/ {print; next} {for (i=0;i<=NF/60;i++) {for (j=1;j<=60;j++) printf "%s", $(i*60 +j); print ""}}' file

說明

  • -v FS=將字段分隔符設置為空,以便每個單個字符都是一個字段。
  • '/^>/ {print; next} '/^>/ {print; next}如果行以>開頭),請打印並轉到下一行。
  • {for (i=0;i<=NF/60;i++) {for (j=1;j<=60;j++) printf "%s", $(i*60 +j); print ""}} 在其余情況下, {for (i=0;i<=NF/60;i++) {for (j=1;j<=60;j++) printf "%s", $(i*60 +j); print ""}} ,以60個字符為一組,循環打印所有字符,然后打印新行,直到到達行尾。

避免完全分開行,僅手動進行子字符串打印。

awk -v FS='\n' '!/^>/ {for (i=0; i<(length($0)/60); i++) {print substr($0, i*60, 60)}; next}7'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM