[英]bash to merge lines in a file
我想转换这个文字:
qa-ops01.mysite.com
/dev/mapper/sys-home 58G 26G 30G 47% /home
/dev/mapper/sys-tmp 3.9G 2.3G 1.5G 61% /tmp
qa-ops02.mysite.com
/dev/mapper/sys-home 58G 26G 30G 47% /usr
/dev/mapper/sys-tmp 3.9G 2.3G 1.5G 61% /var
qa-ops03.mysite.com
/dev/mapper/sys-home 58G 26G 30G 47% /lib
/dev/mapper/sys-tmp 3.9G 2.3G 1.5G 61% /etc
到这一个:
qa-ops01.mysite.com /dev/mapper/sys-home 58G 26G 30G 47% /home
qa-ops01.mysite.com /dev/mapper/sys-tmp 3.9G 2.3G 1.5G 61% /tmp
qa-ops02.mysite.com /dev/mapper/sys-home 58G 26G 30G 47% /usr
qa-ops02.mysite.com /dev/mapper/sys-tmp 3.9G 2.3G 1.5G 61% /var
qa-ops03.mysite.com /dev/mapper/sys-home 58G 26G 30G 47% /lib
qa-ops03.mysite.com /dev/mapper/sys-tmp 3.9G 2.3G 1.5G 61% /etc
我用过
cat FILE |sed 'N;s/.com\n//'
无论如何要实现这一点,或者我应该写出If ...那么......
谢谢大家的答案:D(你总是给我看新东西:D)
我不太了解sed,但在AWK:
awk 'NR==1{prefix=$0;next} {print prefix, $0}' file
如果是这种情况,请查找仅包含一个字段(列)的行,将其用作前缀。 这意味着,对上述脚本的唯一更改是NF(字段数)代替NR(记录数或行数)。
awk 'NF==1{prefix=$0;next} {print prefix, $0}' file
potong的答案几乎是正确的; 它只处理一个服务器,而不是多个服务器,但所需的更改很小。
$ sed -e '/^[^ ]*$/{h;d;}' -e 'G; s/\(.*\)\n\(.*\)/\2 \1/' data
qa-ops01.mysite.com /dev/mapper/sys-home 58G 26G 30G 47% /home
qa-ops01.mysite.com /dev/mapper/sys-tmp 3.9G 2.3G 1.5G 61% /tmp
qa-ops02.mysite.com /dev/mapper/sys-home 58G 26G 30G 47% /usr
qa-ops02.mysite.com /dev/mapper/sys-tmp 3.9G 2.3G 1.5G 61% /var
qa-ops03.mysite.com /dev/mapper/sys-home 58G 26G 30G 47% /lib
qa-ops03.mysite.com /dev/mapper/sys-tmp 3.9G 2.3G 1.5G 61% /etc
$
该脚本分为两部分,由两个-e
选项标识。 第一部分标识服务器名称; 这些行不包含空格(因此/^[^ ]*$/
查找没有空格的行),并将该行复制到保留空间( h
),然后将其删除( d
)并继续下一行。 脚本的第二部分仅在包含空格的行上执行。 它在换行符( G
)之后将保留空间的内容附加到模式空间; 然后它将行拆分为“换行符之前的所有内容”和“换行符之后的所有内容”,然后切换它们以便'after'( \\2
)首先出现,然后是空格,然后是'before'( \\1
) 。
这使用经典的sed
正则表达式; 它在Mac OS X(10.7.5)上进行了测试,包括BSD sed
和GNU sed
没有任何变化。 GNU sed
具有-r
等选项来更改正则表达式的解释,这将为您节省一些反斜杠。
这可能适合你(GNU sed):
sed -r '1{h;d};G;s/(.*)\n(.*)/\2 \1/' file
1{h;d}
将第一行保存在保留空间(HS)中,然后删除模式空间(PS)。 G
都会将换行符和HS附加到PS。 s/(.*)\\n(.*)/\\2 \\1/
重新安排PS并删除引入的换行符。 自发布答案后,原始问题已更改,请考虑到这一点:
sed -r '/%/!{h;d};G;s/(.*)\n(.*)/\2 \1/' file
这通过在HS中保存不包含%
行来处理多个服务器。
试试这个:
awk '!/^\/dev/{header=$0;next} {print header, $0}' input.txt
或者(功能相同,但更容易阅读和理解,IMO):
awk '{if($0 !~ /^\/dev/){header=$0}else{print header, $0}}' input.txt
awk '{if($0~/mysite.com/){x=$0}else{print x,$0}}' your_file
在这里测试
使用awk的另一种方法如下:
awk '{if ($1 ~ /mysite.com/){a= $0 } if ($1 ~ /dev/){ print a" "$0}}' temp.txt
a = $0
将该行复制到包含mysite.com
的if /dev
则它连接两行 或其他变种的potong sed
sed -re '/mysite.com/{h;d};G;s/(.*)\\n(.*)/\\2 \\1/' temp.txt
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.