bash / sed / awk / etc删除所有其他换行符


39

bash命令输出以下内容:

Runtime Name: vmhba2:C0:T3:L14
Group State: active
Runtime Name: vmhba3:C0:T0:L14
Group State: active unoptimized
Runtime Name: vmhba2:C0:T1:L14
Group State: active unoptimized
Runtime Name: vmhba3:C0:T3:L14
Group State: active
Runtime Name: vmhba2:C0:T2:L14
Group State: active

我想将其传送到某种东西,使其看起来像这样:

Runtime Name: vmhba2:C0:T1:L14 Group State: active 
Runtime Name: vmhba3:C0:T3:L14 Group State: active unoptimized
Runtime Name: vmhba2:C0:T2:L14 Group State: active
[...]

即删除所有其他换行符

我尝试过,... |tr "\nGroup" " "但是它删除了所有换行符,并且还吃了其他一些字母。谢谢


2
tr完全基于字符:您要求tr删除换行符以及所有'G','r','o','u'和'p'。
格伦·杰克曼

Answers:


80

现在无法测试,但是

... | paste - - 

应该做


5
+1-运作优雅。(它paste -d ' ' - -
在行

4
您能解释一下该命令如何工作吗?为什么有两个-?谢谢
bbaja42 2012年

7
paste用于连接文件中的相应行:paste file1 file2 file3 ...。如果“文件”参数之一是“-”,则将从标准输入中读取行。如果有2个“-”参数,则粘贴将从stdin中提取2行。等等。请参见手册页
格伦·杰克曼

10

一种可能性是:

awk 'ORS=NR%2?" ":"\n"'

如果行号可以被2整除,请以换行结尾,否则以空格结尾。

(在CentOS 6,GNU Awk 3.1.7上测试)

使用sed(请参阅说明):

sed ':a;N;$!ba;s/\nGroup/ Group/g'

进一步阅读:


8

如果要使用sed,则没有理由将整个文件读入内存。您可以像这样合并所有其他行:

sed 'N;s/\n/ /' inputfile

使用您想要的任何字符代替空格。

这是使用awk的另一种方法:

awk '{printf "%s", $0; if (getline) print " " $0; else printf "\n"}' inputfile

所述if/else手柄其中存在奇数个文件中的行的情况下。没有它,最后的奇数行将被打印两次。否则,为了进行比较,您可以执行以下操作:

awk '{printf "%s", $0; getline; print " " $0}'

1
最新评论:1)如果字符串带有百分号,则始终对printf使用格式说明符,2)为避免最后一行重复,请将$ 0设置为“” –awk '{printf "%s", $0; $0=""; getline; print " " $0}'
glenn jackman 2012年

3

最惯用的方法awk如下:

awk 'ORS=NR%2?FS:RS' file

它输出:

Runtime Name: vmhba2:C0:T3:L14 Group State: active
Runtime Name: vmhba3:C0:T0:L14 Group State: active unoptimized
Runtime Name: vmhba2:C0:T1:L14 Group State: active unoptimized
Runtime Name: vmhba3:C0:T3:L14 Group State: active
Runtime Name: vmhba2:C0:T2:L14 Group State: active

为了解释它,我们需要定义每个内置变量:

  • RS记录分隔符。默认为\n(新行)。
  • ORS输出记录分隔符。默认为\n(新行)。
  • FS字段分隔符。默认为(空格)。
  • NR 记录数。

由于默认的记录分隔符是新行,因此默认情况下,一条记录是一行。

NR%2是的模数NR/2,因此它将是010对于偶数行和1奇数行。

var=condition?condition_if_true:condition_if_false 是三元运算符。

总之,ORS=NR%2?FS:RS我们正在定义输出记录分隔符:

  • 如果记录数在表格上2k + 1,即在偶数行上,则输出记录分隔符将设置为FS,即空格。
  • 如果记录数在形式上2k,即在奇数行上,则输出记录分隔符将设置为RS,即换行。

这样,奇数行以空格结尾,然后与下一行合并。在该行之后,将打印一个新行。

惯用awk中的更多信息。


2

这对我在Linux上有效:

... | tr "\\n" " "

这将用空格替换换行符;您必须转义换行符才能正常工作。


这将删除所有换行符,而不是其他所有换行符。
特伦顿

2

在bash中:

... | while read l1; do read l2; echo "$l1 $l2"; done


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.