繁体   English   中英

bash合并文件中的行

[英]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

  1. a = $0将该行复制到包含mysite.com的if
  2. 如果第二行包含/dev则它连接两行

或其他变种的potong sed

sed -re '/mysite.com/{h;d};G;s/(.*)\\n(.*)/\\2 \\1/' temp.txt

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM