【问题标题】:How to add blank line between lines from different ip groups如何在来自不同ip组的行之间添加空行
【发布时间】:2014-06-01 23:57:36
【问题描述】:

我有一个格式为 (ip,info) 的文件 localhost.txt:

192.168.1.8 host name alex
192.168.1.8 macaddress 1354321313
192.168.1.8 time 04:18
192.168.1.20 date 6/2/2012
192.168.1.20 host name riko
192.168.1.11 year 2014
192.168.1.11 host name cr7
192.168.1.11 shared files off
192.168.1.11 time 12:84

我希望输出结果为:

192.168.1.8 host name alex
192.168.1.8 macaddress 1354321313
192.168.1.8 time 04:18

192.168.1.20 date 6/2/2012
192.168.1.20 host name riko

192.168.1.11 year 2014
192.168.1.11 host name cr7
192.168.1.11 shared files off
192.168.1.11 time 12:84

我试过了

awk '{if(NR > 1 && $2 != prev_two){printf "\n";} prev_two=$2; print $0}' localhost.txt >> result.txt

还有这个

awk 'prev != $2 {print ""} {print; prev=$2}' localhost.txt >> result.txt

但是没用

我读过这个

Add blank line between lines from different groups

【问题讨论】:

    标签: text awk


    【解决方案1】:

    这个:

    $ awk '{if(NR > 1 && $1 != prev_two){printf "\n";} prev_two=$1; print $0}' localhost.txt >> result.txt
    $ cat result.txt
    192.168.1.8 host name alex
    192.168.1.8 macaddress 1354321313
    192.168.1.8 time 04:18
    
    192.168.1.20 date 6/2/2012
    192.168.1.20 host name riko
    
    192.168.1.11 year 2014
    192.168.1.11 host name cr7
    192.168.1.11 shared files off
    192.168.1.11 time 12:84
    

    应该可以。这是您要分组的第一个字段,而不是第二个(因此是 $1)。

    【讨论】:

    • 'NR>1 && $1!=prev {print ""}; {prev=$1; print}'
    【解决方案2】:

    您可以通过awk 做到这一点

    awk '$1!=a && NR>1 {$0=RS$0} {a=$1} 1' file
    192.168.1.8 host name alex
    192.168.1.8 macaddress 1354321313
    192.168.1.8 time 04:18
    
    192.168.1.20 date 6/2/2012
    192.168.1.20 host name riko
    
    192.168.1.11 year 2014
    192.168.1.11 host name cr7
    192.168.1.11 shared files off
    192.168.1.11 time 12:84
    

    【讨论】:

      【解决方案3】:

      这不是一个单一的线 usnig awk,但它有效。

      #!/bin/bash
      
      prev=""
      while read -r line
      do
         cur=$(echo "$line" | awk '{print $1}')
         if [[ "$prev" == "" ]]; then
           prev="$cur"
         elif [[ "$prev" != "$cur" ]]; then
           echo ""
         fi
         echo "$line"
         prev="$cur"
      done
      

      【讨论】:

      • 谢谢..我认为 awk 非常非常快..非常感谢 :)
      猜你喜欢
      • 2011-05-21
      • 1970-01-01
      • 2020-12-05
      • 2018-06-15
      • 1970-01-01
      • 1970-01-01
      • 2023-01-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多