【问题标题】:awk transpose lines with removing duplicate column based on pattern with 4th column break afterawk 转置行并根据模式删除重复列,之后第 4 列中断
【发布时间】:2018-12-05 23:22:51
【问题描述】:

嗨,我正在转置这多行 输入并将其转置为

nickname jeff site A site_out out 9C:02:24
nickname jeff site A site_in in 9C:02:24
nickname jeff site A in DOOR_SECT_X1 68:01:40
nickname jeff site A in DOOR_SECT_A1 68:01:10
nickname david site B site_in in EA:A7:D3
nickname david site B in EXT_MAT-G 80:16:7B
nickname martin site C in EXT_MAT-H 80:16:7B
nickname martin site C in ARR_N1D 68:01:10
nickname martin site C in ARR_N2D 68:01:10
nickname geoff site A site_out out 00:C9:AB
nickname geoff site A site_in in 00:C9:AB
nickname geoff site A in DEF_DOOR_ARR 80:07:E6

这个输出

nickname jeff site A 
site_out out 9C:02:24
site_in in 9C:02:24
in DOOR_SECT_X1 68:01:40
in DOOR_SECT_A1 68:01:10
nickname david site B 
site_in in EA:A7:D3
in EXT_MAT-G 80:16:7B
nickname martin site C 
in EXT_MAT-H 80:16:7B
in ARR_N1D 68:01:10
in ARR_N2D 68:01:10
nickname geoff site A 
site_out out 00:C9:AB
site_in in 00:C9:AB
in DEF_DOOR_ARR 80:07:E6

其中重复的“昵称”以及第二列,例如martin / geoff 被删除并仅保留一次,并且在每 4 列完成中断到下一行

我被困在这里,下面的代码返回

awk '{k=$1 FS $2 FS$3 FS$4 FS; a[k]=a[k] FS $NF}
   END {for(k in a) print k  "\n" a[k]}' 

nickname david site B
 EA:A7:D3 80:16:7B
nickname geoff site A
 00:C9:AB 00:C9:AB 80:07:E6
nickname martin site C
 80:16:7B 68:01:10 68:01:10
nickname jeff site A
 9C:02:24 9C:02:24 68:01:40 68:01:10

谢谢你提示如何使用这个

【问题讨论】:

    标签: awk pattern-matching row multiple-columns transpose


    【解决方案1】:

    我在这个脚本上取得了一些成功:

    您需要知道何时停止打印连续昵称:这就是 $2 != nickname 条件。如果是这样,它会打印昵称和剩余的列(即print_data 函数)并“跳过”到文件中的下一行(即next

    print_data 函数打印昵称部分之后的所有剩余列。如果您在行尾添加更多列,则无需更改该脚本。

    BEGIN {
      nickname = ""
    }
    
    function print_data() {
      for (i=5; i<=NF; i++) {
        printf "%s ", $i
      }
      print ""
    }
    
    # change "$2" if you add more column before nickname
    $2 != nickname {
      nickname = $2
      print $1, $2, $3, $4
      print_data()
      next
    }
    
    {
      print_data()
    }
    

    【讨论】:

    • 嗨@customcommander,customcommander,谢谢,你能给我简要解释一下这些行吗?例如如果我要在昵称之前再添加一列,在哪里更改它,这将对我有所帮助,br ya801
    • 谢谢,玩了一下,它适用于我想要的许多列
    【解决方案2】:

    看看这个 Perl 单行代码

    $ cat ya801.txt
    nickname jeff site A site_out out 9C:02:24
    nickname jeff site A site_in in 9C:02:24
    nickname jeff site A in DOOR_SECT_X1 68:01:40
    nickname jeff site A in DOOR_SECT_A1 68:01:10
    nickname david site B site_in in EA:A7:D3
    nickname david site B in EXT_MAT-G 80:16:7B
    nickname martin site C in EXT_MAT-H 80:16:7B
    nickname martin site C in ARR_N1D 68:01:10
    nickname martin site C in ARR_N2D 68:01:10
    nickname geoff site A site_out out 00:C9:AB
    nickname geoff site A site_in in 00:C9:AB
    nickname geoff site A in DEF_DOOR_ARR 80:07:E6
    
    $ perl -lane ' $y=join(" ",@F[0..3]) ; $z=join(" ",@F[4..$#F]); if ($x ne $y) { print "$y\n$z";$x=$y } else { print "$z";} ' ya801.txt
    nickname jeff site A
    site_out out 9C:02:24
    site_in in 9C:02:24
    in DOOR_SECT_X1 68:01:40
    in DOOR_SECT_A1 68:01:10
    nickname david site B
    site_in in EA:A7:D3
    in EXT_MAT-G 80:16:7B
    nickname martin site C
    in EXT_MAT-H 80:16:7B
    in ARR_N1D 68:01:10
    in ARR_N2D 68:01:10
    nickname geoff site A
    site_out out 00:C9:AB
    site_in in 00:C9:AB
    in DEF_DOOR_ARR 80:07:E6
    
    $
    

    【讨论】:

    • 请考虑为答案投票!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-08
    • 1970-01-01
    • 2015-02-20
    • 1970-01-01
    • 2022-06-27
    • 1970-01-01
    相关资源
    最近更新 更多