我有一个包含序列数据的文件,其中每个新段落(由两个空行分隔)包含一个新序列:
#example
ASDHJDJJDMFFMF
AKAKJSJSJSL---
SMSM-....SKSKK
....SK
SKJHDDSNLDJSCC
AK..SJSJSL--HG
AHSM---..SKSKK
-.-GHH
我希望最终得到一个文件:
ASDHJDJJDMFFMFAKAKJSJSJSL---SMSM-....SKSKK....SK
SKJHDDSNLDJSCCAK..SJSJSL--HGAHSM---..SKSKK-.-GHH
每个序列的长度相同(如果有帮助的话)。
我也希望在存储在不同方向的多个文件中执行此操作。
我刚试过
sed -e '/./{H;$!d;}' -e 'x;/regex/!d' ./text.txt
但是这只是删除了整个文件:S
任何帮助都会受到赞赏 - 如果你知道如何在perl或其他方面做到这一点,则不必是sed,那也很棒。
感谢。
答案 0 :(得分:3)
您要做的只是转换空白行分隔记录(RS)文件,其中每个字段由换行符分隔为换行符分隔的记录文件,其中每个字段均为空分隔(OFS) )。只需设置适当的awk变量并重新编译记录:
$ awk '{$1=$1}1' RS= OFS= file
ASDHJDJJDMFFMFAKAKJSJSJSL---SMSM-....SKSKK....SK
SKJHDDSNLDJSCCAK..SJSJSL--HGAHSM---..SKSKK-.-GHH
答案 1 :(得分:2)
awk '
/^[[:space:]]*$/ {if (line) print line; line=""; next}
{line=line $0}
END {if (line) print line}
'
perl -00 -pe 's/\n//g; $_.="\n"'
对于多个文件:
# adjust your glob pattern to suit,
# don't be shy to ask for assistance
for file in */*.txt; do
newfile="/some/directory/$(basename "$file")"
perl -00 -pe 's/\n//g; $_.="\n"' "$file" > "$newfile"
done
答案 2 :(得分:1)
Perl one-liner,如果您愿意:
perl -nle 'BEGIN{$/=""};s/\n//g;print $_' file
$/
变量相当于awk
的{{1}}变量。当设置为空刺(RS
)时,它会导致两个或多个空行被视为一个空行。这就是所谓的“段落模式”的阅读。对于每个读取的记录,将删除所有换行符。 ""
开关在每个输出字符串的末尾添加换行符,从而得到所需的结果。
答案 3 :(得分:0)
只是尝试找到那些双线换行符:\ n或\ r \ n并首先替换具有特殊符号的那些:$: 之后,用空字符串替换每个换行符以将整个文件放在一行中。 接下来,用简单的换行符替换你的特殊标志:)