合并图案之间的线条

时间:2012-07-30 10:01:00

标签: sed

我有一个需要解析的大文件(~20GB)。我需要合并所有不以整数开头的行。文件看起来像这样:

     1647 Lorem ipsum dolor sit amet, consectetur adipisicing elit
     1906 ut perspiciatis unde omnis iste natus error sit 
     1909  Nemo enim ipsam voluptatem
            dolores eos qui ratione
       quia non numquam eius
         nisi ut aliquid ex ea com
     1820 zt enim ad minim veniam

最后我需要它看起来像这样:

     1647 Lorem ipsum dolor sit amet, consectetur adipisicing elit
     1906 ut perspiciatis unde omnis iste natus error sit 
     1909  Nemo enim ipsam voluptatem dolores eos qui ratione quia non numquam eius nisi ut aliquid ex ea com
     1820 zt enim ad minim veniam

我尝试了很多东西,例如:

使用注册表...在较小的文件上运行良好,在大文件上运行内存不足

sed ':a;N;$!ba;s/\n[\t ]*\([a-zA-Z]\+\)/ \1/g'

使用保持缓冲区(这只打印以整数开头的行):

sed -n '
/^[ \t]\+[0-9]\+/ {
    p
    h
}
/^[ \t]\+[0-9]\+/ !{
    H
}
'

或:

sed -n '
/^[ \t]\+[0-9]\+/ b jumpTO
        H
        $ b jumpTO
        b
:jumpTO
x
p
'

它错过了从没有整数的行替换空格和制表符的代码,它们并不重要,并且实现起来很简单。

请查看代码并指出我做错了什么。 谢谢

6 个答案:

答案 0 :(得分:1)

sed通常不太擅长将线组合在​​一起,因为它设计为按行工作。

使用awk的解决方案可能更好:

input.txt中:

$ cat input.txt
1647 Lorem ipsum dolor sit amet, consectetur adipisicing elit
1906 ut perspiciatis unde omnis iste natus error sit 
1909  Nemo enim ipsam voluptatem
       dolores eos qui ratione
  quia non numquam eius
    nisi ut aliquid ex ea com
1820 zt enim ad minim veniam

script.awk:

/^[0-9]+/ {
    if (NR==1) {
        printf "%s", $0
    } else {
        printf "\n%s", $0
    }
}

/^[^0-9]+/ {
    gsub(/^ /,"",$0);
    gsub(/ $/,"",$0);
    printf "%s", $0
}

END {
    printf "\n"
}

输出:

$ awk -f script.awk input.txt
1647 Lorem ipsum dolor sit amet, consectetur adipisicing elit
1906 ut perspiciatis unde omnis iste natus error sit 
1909  Nemo enim ipsam voluptatemdolores eos qui rationequia non numquam eiusnisi ut aliquid ex ea com
1820 zt enim ad minim veniam

更新:改进代码以删除空格

答案 1 :(得分:1)

这个单行帮助吗? (AWK)

 awk '$1~/[0-9]+/{printf "\n"$0;next}{printf $0}' yourfile

<强>测试

kent$  cat test.txt
1647 Lorem ipsum dolor sit amet, consectetur adipisicing elit
1906 ut perspiciatis unde omnis iste natus error sit 
1909  Nemo enim ipsam voluptatem
       dolores eos qui ratione
  quia non numquam eius
    nisi ut aliquid ex ea com
1820 zt enim ad minim veniam

kent$  awk '$1~/[0-9]+/{printf "\n"$0;next}{printf $0}' test.txt

1647 Lorem ipsum dolor sit amet, consectetur adipisicing elit
1906 ut perspiciatis unde omnis iste natus error sit 
1909  Nemo enim ipsam voluptatem       dolores eos qui ratione  quia non numquam eius    nisi ut aliquid ex ea com
1820 zt enim ad minim veniam

答案 2 :(得分:1)

可能会对你有用:

->nawk '{if($1~"^[a-zA-Z]"){p=p" "$0;flag=1}else{if(flag==1)print p;p=$0;print p;flag=0}}' temp

> cat temp
1906 ut perspiciatis unde omnis iste natus error sit 
1909  Nemo enim ipsam voluptatem
dolores eos qui ratione
quia non numquam eius
nisi ut aliquid ex ea com
1820 zt enim ad minim veniam

> nawk '{if($1~"^[a-zA-Z]"){p=p" "$0;flag=1}else{if(flag==1)print p;p=$0;print p;flag=0}}' temp
1906 ut perspiciatis unde omnis iste natus error sit 
1909  Nemo enim ipsam voluptatem
1909  Nemo enim ipsam voluptatem dolores eos qui ratione quia non numquam eius nisi ut aliquid ex ea com
1820 zt enim ad minim veniam

>

答案 3 :(得分:1)

使用awk的一种方式:

awk '/[0-9]/ { if (line) print line; line = $0; next } { sub(/^[ \t]+/, " "); line = line $0 } END { print line }' file.txt

结果:

     1647 Lorem ipsum dolor sit amet, consectetur adipisicing elit
     1906 ut perspiciatis unde omnis iste natus error sit 
     1909  Nemo enim ipsam voluptatem dolores eos qui ratione quia non numquam eius nisi ut aliquid ex ea com
     1820 zt enim ad minim veniam

答案 4 :(得分:1)

sed =)

没有什么是不可能的
sed -n '/^[0-9]/{x;p};/^[^0-9]/{H;x;s/\n\s*\([^0-9]\)/ \1/;x};${x;p}'

1647 Lorem ipsum dolor sit amet, consectetur adipisicing elit
1906 ut perspiciatis unde omnis iste natus error sit
1909  Nemo enim ipsam voluptatem dolores eos qui ratione quia non numquam eius nisi ut aliquid ex ea com
1820 zt enim ad minim veniam

答案 5 :(得分:1)

这可能适合你(GNU sed):

sed ':a;$!N;s/\n\s*\([^0-9 ]\)/ \1/;ta;P;D' file