一个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
我想pipe它到一些东西,使其看起来像这样:
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" " "
但是它删除了所有的换行符,并且还有其他一些字母。 谢谢
现在不能testing,但是
... | paste - -
应该这样做
一种可能性是:
awk 'ORS=NR%2?" ":"\n"'
如果行号可以被2整除,则以新行结束,否则以空格结束。
(testing:CentOS 6,GNU Awk 3.1.7)
使用sed(请参阅解释 ):
sed ':a;N;$!ba;s/\nGroup/ Group/g'
进一步阅读:
如果你想使用sed
,没有理由把整个文件读入内存。 你可以像这样合并每一行:
sed 'N;s/\n/ /' inputfile
使用任何你喜欢的angular色而不是空格。
这是使用awk的另一种方法:
awk '{printf "%s", $0; if (getline) print " " $0; else printf "\n"}' inputfile
if/else
处理文件中有奇数行的情况。 没有它,奇数的最后一行会打印两次。 否则,为了比较,你可以这样做:
awk '{printf "%s", $0; getline; print " " $0}'
这在Linux上适用于我:
... | tr "\\n" " "
这将replace换行符的空白空间; 你必须逃避换行符才能正常工作。
在bash中:
... | while read l1; do read l2; echo "$l1 $l2"; done
在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
为了解释它,我们需要定义每个内置variables:
RS
logging分离器。 默认为\n
(换行)。 ORS
输出logging分隔符。 默认为\n
(换行)。 FS
字段分隔符。 默认为
(空间)。 NR
logging数。 由于默认logging分隔符是新行,因此默认情况下,logging是一行。
NR%2
是NR/2
的模量,因此它可以是0
或1
。 0
表示偶数行, 1
表示奇数行。
var=condition?condition_if_true:condition_if_false
是三元运算符。
一起说, ORS=NR%2?FS:RS
我们正在定义输出logging分隔符:
2k + 1
的格式,即偶数行,则输出logging分隔符被设置为FS
,即空格。 2k
,即在奇数行上,则输出logging分隔符被设置为RS
,即新的行。 这样,奇数行以空格结束,然后与下一行结合。 在那一行之后,打印一个新行。
更多信息在习语awk 。
如果Perl是一个选项:
perl -pe 's/\n/ / if $. % 2 == 1' file
s/\n/ /
用空格replace换行符
$.
是行号
如何使用grep
?
.. | grep -v '^Group State'