Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sed 在图案之间合并线条_Sed - Fatal编程技术网

Sed 在图案之间合并线条

Sed 在图案之间合并线条,sed,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 q

我需要解析一个大文件(~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
最后我需要它看起来像这样:

     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'
使用Hold buffer(仅打印以integer开头的行):

或:

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

请看一下代码,指出我做错了什么。
谢谢

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

更新:用于删除空白的改进代码

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
更新:删除空白的改进代码

这一行程序有用吗?(awk)

测试

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
这一行有帮助吗?(awk)

测试

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

也许这对你有用:

->nawk'{if($1~“^[a-zA-Z]”){p=p'$0;flag=1}其他{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

>

也许这对你有用:

->nawk'{if($1~“^[a-zA-Z]”){p=p'$0;flag=1}其他{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

>

单向使用
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

单向使用
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

使用
sed没有什么是不可能的


使用
sed没有什么是不可能的

这可能适用于您(GNU-sed):

这可能适用于您(GNU-sed):


删除所有换行符,将数字替换为“\n{number}”?当然,只有当文本中没有数字时,这才有效。请删除所有换行符,将数字替换为“\n{number}”?当然,只有当文本中没有数字时,这才有效。