繁体   English   中英

使用awk或sed或cut过滤文本文件?

[英]Filter text file using awk or sed or cut?

我正在尝试解决此问题。

$ cat test.txt  
server1
ec2-xx.xx.xx.xxus-west-2.compute.amazonaws.com
Search
ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
Web
ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
Web
ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
server2
ec2-xx.xx-xx-xx.us-west-2.compute.amazonaws.com
loaddb
ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
ec2dd
ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
server2
ec2-xx.xx-xx-xx.us-west-2.compute.amazonaws.com
loaddb
ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com

我需要这样的输出:

$ cat test.txt
server1:ec2-xx.xx.xx.xxus-west-2.compute.amazonaws.com  
Search:ec2-xx.xx.xx.xxus-west-2.compute.amazonaws.com  
Web:ec2-xx.xx.xx.xxus-west-2.compute.amazonaws.com  
Web:ec2-xx.xx.xx.xxus-west-2.compute.amazonaws.com  
server2:ec2-xx.xx.xx.xxus-west-2.compute.amazonaws.com  
loaddb:ec2-xx.xx.xx.xxus-west-2.compute.amazonaws.com  
ec2dd:ec2-xx.xx.xx.xxus-west-2.compute.amazonaws.com  
server2:ec2-xx.xx.xx.xxus-west-2.compute.amazonaws.com  
loaddb:ec2-xx.xx.xx.xxus-west-2.compute.amazonaws.com

使用sed

$ sed 'N;s/\n/:/' test.txt
server1:ec2-xx.xx.xx.xxus-west-2.compute.amazonaws.com
Search:ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
Web:ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
Web:ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
server2:ec2-xx.xx-xx-xx.us-west-2.compute.amazonaws.com
loaddb:ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
ec2dd:ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
server2:ec2-xx.xx-xx-xx.us-west-2.compute.amazonaws.com
loaddb:ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com 

此方法使用两个sed命令:

  • N从文件中读取第二行,并将其添加到模式空间。 这样,模式空间中始终具有连续的两行。

  • s/\\n/:/从模式空间的两行之间删除换行符,并用冒号代替。

使用awk

$ awk 'NR%2==1{name=$1;next} {print name ":" $0;}' test.txt
server1:ec2-xx.xx.xx.xxus-west-2.compute.amazonaws.com
Search:ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
Web:ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
Web:ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
server2:ec2-xx.xx-xx-xx.us-west-2.compute.amazonaws.com
loaddb:ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
ec2dd:ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
server2:ec2-xx.xx-xx-xx.us-west-2.compute.amazonaws.com
loaddb:ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com 

笔记:

  • NR%2==1{name=$1;next}

    这将读取第一行和所有后续的奇数行,并将第一个字段分配给变量name 然后,它跳过其余命令,并跳转到next行重新开始。

  • print name ":" $0

    在偶数行上,这将打印名称,冒号和当前行。

使用纯壳

while read name; read line
do
        printf "%s:%s\n" "$name" "$line"
done <test.txt

在这里,从text.txt中将一行读入变量name然后将另一行读入变量line 然后将这两个标记之间用冒号打印。

您可以简单地使用paste命令,

paste -d: - - < file

通过Perl,

perl -pe 's/\n/:/g if $.%2==1' file

$. Perl中的NR与awk中的NR相似。 因此,它仅采用奇数行并将换行符替换为:仅在特定行上。

这个awk可以做到,但是如果您不完全了解getline ,请小心。

awk '{a=$1;getline;print a":"$1}' file
server1:ec2-xx.xx.xx.xxus-west-2.compute.amazonaws.com
Search:ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
Web:ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
Web:ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
server2:ec2-xx.xx-xx-xx.us-west-2.compute.amazonaws.com
loaddb:ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
ec2dd:ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
server2:ec2-xx.xx-xx-xx.us-west-2.compute.amazonaws.com
loaddb:ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com

这是一种更好的方法:

awk 'ORS=NR%2?":":RS' file
server1:ec2-xx.xx.xx.xxus-west-2.compute.amazonaws.com
Search:ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
Web:ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
Web:ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
server2:ec2-xx.xx-xx-xx.us-west-2.compute.amazonaws.com
loaddb:ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
ec2dd:ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com
server2:ec2-xx.xx-xx-xx.us-west-2.compute.amazonaws.com
loaddb:ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com

暂无
暂无

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

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