Linux 使用awk、sed或cut过滤文本文件?
我正在努力解决这个问题Linux 使用awk、sed或cut过滤文本文件?,linux,awk,sed,grep,cut,Linux,Awk,Sed,Grep,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
$ 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/:/从模式空间的两行之间删除换行符,并用冒号替换
使用awk:
注:
NR%2==1{name=$1;next}
这将读取第一行和所有后续奇数行,并将第一个字段指定给变量名。然后它跳过其余的命令,跳转到下一行开始
打印名称:$0
在偶数行上,打印名称、冒号和当前行
使用纯壳
这里,一行从text.txt读入变量名,下一行读入变量行。然后,这两个字符之间用冒号打印。使用sed:
此方法使用两个sed命令:
N从文件中读入第二行并将其附加到模式空间。这样,图案空间中始终有两条连续的线
s/\n/:/从模式空间的两行之间删除换行符,并用冒号替换
使用awk:
注:
NR%2==1{name=$1;next}
这将读取第一行和所有后续奇数行,并将第一个字段指定给变量名。然后它跳过其余的命令,跳转到下一行开始
打印名称:$0
在偶数行上,打印名称、冒号和当前行
使用纯壳
这里,一行从text.txt读入变量名,下一行读入变量行。然后这两个字符之间用冒号打印。您只需使用粘贴命令
美元。Perl中的NR类似于awk中的NR。因此,它只接受奇数行,并将换行符替换为:仅在该特定行上。您只需使用粘贴命令
美元。Perl中的NR类似于awk中的NR。因此,它只接受奇数行,并将换行符替换为:only on the specific line.这个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
这个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
起初,您只是说不要使用getline函数。但现在您使用getline函数发布了一个答案。为什么?getline do在这个简单的输入中工作得很好,但是如果遇到更复杂的输入,它可能会失败,所以这是一个警告,提醒您在使用它时要小心。对于downvoter:没有必要在不说明原因的情况下给出-1。@AvinashRaj用更好的awk解决方案更新了帖子。起初,你只是说不要使用getline函数。但现在您使用getline函数发布了一个答案。为什么?getline do在这个简单的输入中工作得很好,但是如果遇到更复杂的输入,它可能会失败,所以这是一个警告,提醒您在使用它时要小心。对于downvoter:没有必要在不说明原因的情况下给出-1。@AvinashRaj用更好的awk解决方案更新了帖子。
perl -pe 's/\n/:/g if $.%2==1' file
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