gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:18:00 29 4
gpt4 key购买 nike

我正在努力解决这个问题。

$ 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 行重新开始。

  • 打印名称“:”$0

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

使用纯shell

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

这里,一行从 text.txt 读入变量 name,下一行读入变量 line。然后在这两者之间打印一个冒号。

关于linux - 使用 awk 或 sed 或 cut 过滤文本文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26375069/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com