[英]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-interval
( awk --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.