将文件的所有单独段落放在单独的行中

时间:2012-12-20 12:03:24

标签: perl sed text-manipulation

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

#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,那也很棒。

感谢。

4 个答案:

答案 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并首先替换具有特殊符号的那些:$: 之后,用空字符串替换每个换行符以将整个文件放在一行中。 接下来,用简单的换行符替换你的特殊标志:)