sed / awk - 将所有文本放在与前面的数字相同的行上

时间:2016-08-20 10:16:24

标签: bash awk sed

如何获取所有收到的文字' number:number'与前面的'相同的行:number'?

10:15
text line one 
text line two
text no pattern

11:12
random text
text is random 
totally random
could be four lines 
could be five

应该成为

10:15 text line one text line two text no pattern
11:12 random text text is random totally random could be four lines could be five

5 个答案:

答案 0 :(得分:2)

这适用于您的示例 -

tr '\n' ' ' < file.txt | sed 's/[0-9]*:[0-9]*/\n&/g'

解释 -

tr最初会将所有内容放在同一行。

然后,sed one liner将在每个num:num模式之前插入新行。

答案 1 :(得分:2)

鉴于输入文件,您需要的是告诉awk使用RS=<null>一次读取一个空行分隔的段落,并使用空白字符的默认OFS值重新编译每个记录/ p>

$ awk -v RS= '{$1=$1}1' file
10:15 text line one text line two text no pattern
11:12 random text text is random totally random could be four lines could be five

答案 2 :(得分:1)

sed和awk解决方案都会加入行,直到检测到新记录或输入完成,在这种情况下打印并清除连接的行 - 使用任一解决方案

sed oneliner

sed -nr '/^[0-9]{2}:[0-9]{2}$/!{H;$!b}; x; s/\n/ /gp'

awk脚本

awk '
!/^[0-9]{2}:[0-9]{2}$/ {
  lines=lines" "$0
  next
}
{if(lines) print lines; lines=$0}
END {print lines}
'

答案 3 :(得分:0)

这是一个GNU AWK脚本:

<强> script.awk

BEGIN { RS = "\n[0-9]+:[0-9]+|\n$" }
      { gsub(/\n/,"",$0)
        printf( "%s%s ", $0,RT) }

awk -f script.awk file.txt

一样使用它

它使用GNU AWK特定扩展RT和正则表达式RS

  • 记录分隔符设置为&#34;冒号分隔的数字对&#34;。
  • 获取文件末尾的最终换行符&#34; | \ n $&#34;被添加以匹配文件中的最后一个换行符。
  • 为了在第二对开始分离:&#34; \ n&#34;在前面添加。因此,第一个结肠分开的数字对&#34; 10:15&#34;已包含在第一个$0中,而不在RT

答案 4 :(得分:0)

这里的诀窍是你想要在段落而不是行上拆分文件。在awk中,如果设置RS =“”,则启用段落模式。 awk循环的每次迭代都会有一个$ 0的段落。然后,您可以替换换行符并将其转换为空格。

awk  <data.txt 'BEGIN { RS = "" ; FS = "\n" } { gsub(/\n/, " ", $0) ; print }'

输出:

10:15 text line one  text line two text no pattern
11:12 random text text is random  totally random could be four lines  could be five

这样做的好处是awk会为你处理所有特殊情况:以空白行结尾的文件,没有空白行结束,没有换行符结束的文件等等。