5

我有一个包含序列数据的文件,其中每个新段落(由两个空行分隔)都包含一个新序列:

#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

任何帮助都将不胜感激 - 不必在 sed 中,如果你知道如何在 perl 或其他东西中做到这一点,那也很棒。

谢谢。

4

4 回答 4

3

您需要做的就是将每个字段由换行符分隔的空行分隔记录 (RS) 文件转换为每个字段不分隔 (OFS) 的换行符分隔记录文件。只需设置适当的 awk 变量并重新编译记录:

$ awk '{$1=$1}1' RS= OFS= file
ASDHJDJJDMFFMFAKAKJSJSJSL---SMSM-....SKSKK....SK
SKJHDDSNLDJSCCAK..SJSJSL--HGAHSM---..SKSKK-.-GHH
于 2012-12-20T13:49:25.667 回答
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
于 2012-12-20T15:22:39.577 回答
1

如果您愿意,可以使用 Perl 单线:

perl -nle 'BEGIN{$/=""};s/\n//g;print $_' file

$/变量等价于awk'sRS变量。当设置为空字符串 ( "") 时,它会导致两个或多个空行被视为一个空行。这就是所谓的“段落式”阅读。对于读取的每条记录,都会删除所有换行符。开关在-l每个输出字符串的末尾添加一个换行符,从而给出所需的结果。

于 2012-12-20T12:57:38.660 回答
0

只需尝试找到那些双换行符: \n 或 \r 并首先用特殊符号替换那些 :$: 然后用空字符串替换每个换行符以将整个文件放在一行中。接下来,用简单的换行符替换您的特殊符号:)

于 2012-12-20T12:06:28.847 回答