2016-08-20 36 views
0

如何将'number:number'的所有文本放到与前面的'number:number'相同的行上?sed/awk - 将所有文本放在与前面的数字相同的行上

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 
+0

文本是否会有任何数字? – VM17

+0

不,它只会是文本或东西线逗号和停止 – user1776732

+0

让我知道我的答案是否适合你。 – VM17

回答

2

这适用于您的示例 -

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

Explanation-

TR将首先把一切都放在同一行。

然后,sed一个班轮将在每个num:num模式之前插入新行。

+0

由于不可移植的使用'\ n',只能在某些seds下工作,会在不包含数字的':'之前插入换行符,并且会在输出开头插入不需要的换行符。 –

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

  • 记录分隔符设置为“冒号分隔数字对”。
  • 为了在文件末尾获得最后的换行符,添加了“| \ n $”以匹配文件中的最后一个换行符。
  • 为了从第二对开始分离:在前面添加“\ n”。因此,第一个结肠分隔号码对“10:15”包含在第一个$0中,而不是在RT中。
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处理所有为你的特殊情况:在一个空行结尾的文件,最终没有一个空行,最终没有一个换行符,等等

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} 
' 
2

既然你需要输入文件中的所有就是告诉AWK使用RS=<null>读取一次一个空行分隔段落和使用默认值OFS重新编译每条记录

$ 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 
+1

这个答案虽然有效,却完全忽略了使用num:num模式作为显着特征的地步。如果你使用这种模式作为生成休息的方式,会更好。 – VM17

+0

这就好比说当有人问他们如何在牙刷旁边使用牙刷挖洞时,应该告诉他们如何用牙刷代替铲子。提问的人不知道正确的做事方式,或者他们不会问。他们从正确的方法而不是错误的方面受益更多。 –

相关问题