将下一行与上一行合并

将下一行与上一行合并

我有一个文本文件,其中包含以下行:

LIN This is the value which I need
      from this line which has a very long line
SHR This1;This2;
     This3;
GYC This is an extra.

输出应该是这样的:

LIN This is the value which I need from this line whi a very..
SHR This1;This2;This3;
GYC This is an extra.

sed在用 Python 实现之前,我先尝试过这个。所以我想出了..

sed 's/     //' filename.txt 

上面的代码片段只做了一件事,它删除了空的 4+1 空格(总是固定的),但是现在我不确定如何继续,因为我必须将行移动到 LINE&SHRT 标签,这样我才能提取信息。此外,当标签行(使用 LINE/SHRT/EKY/EKC/USER)继续时,它会由一个额外的空格指示。如果应该是新行,那么它会继续到下一行。

问题,sed 可以用来将行移动到上一行吗?如何区分空白区域以指示线路是继续还是终止

答案1

把事情简单化:

sed 'H;1h;$!d;g;s/\n  */ /g'

这个简短的脚本将连接所有以至少一个空格开头的行与上一行。

工作原理:H将每一行附加到保留空间。为了避免出现前导换行符,第一行将被复制1h。如果这不是最后一行,d则将其删除,否则将保留空间移动到带有 的模式空间g。现在整个文件都在模式空间中,现在该s命令将所有带空格的换行符替换为一个空格。

使用 GNUsed你可以让它变得更简单:

sed -z 's/\n  */ /g'

答案2

另一种方式AWK

awk '{$1=$1;printf("%s ",$0)};NR%2==0{print ""}' FILE.txt

出去

LIN This is the value which I need from this line which has a very long line
SHR This1;This2; This3;
GYC This is an extra.
  • $1=$1: 删除起始行的空格
  • printf("%s ",$0)从行尾删除\n( )newline
  • NR%2==0{print ""}print \n( newline) 对于偶数行(例如:2,4,6,...)

答案3

/^[A-Z]/        { if (line) { print line }; line =      $0 }
/^ /            { sub(/     /, "")        ; line = line $0 }
END             { if (line) { print line }                 }

awk脚本将产生

LIN This is the value which I need from this line which has a very long line
SHR This1;This2;This3;
GYC This is an extra.

鉴于问题中提供的数据file.in

  1. 第一个块将对以大写 ASCII 字符开头的每一行执行。line如果里面有内容就会输出 的内容,然后将当前输入的行保存到 中line。这负责输出前一个输入“块”的构造行,并开始组装下一个输出行。

  2. 第二个块将对开头至少有一个空格的每一行执行,并将删除前五个空格,然后将其添加到 的末尾line。这将从输入中的连续行构建输出行。

  3. 如果其中有任何内容,该END块将输出已保存的内容。line这负责从输入的最终“块”输出组装行。

你运行这个

$ awk -f script.awk file.in

此脚本处理可能存在多个缩进(连续)行的情况。

相关内容