awk 比较当前与下一个

awk 比较当前与下一个

我的输入文件是:

     puloto_cluster_b_02_sys
puloto_cluster_b_02_sys puloto_cluster_b_generic_cg
        puloto_cluster_b_02_temp
        puloto_cluster_b_04_sys
puloto_cluster_b_04_sys puloto_cluster_b_generic_cg
        puloto_cluster_b_04_temp
        puloto_cluster_b_06_sys
puloto_cluster_b_06_sys puloto_cluster_b_generic_cg
        puloto_cluster_b_08_sys
puloto_cluster_b_08_sys puloto_cluster_b_generic_cg
        puloto_cluster_b_10_sys
puloto_cluster_b_10_sys puloto_cluster_b_generic_cg

我希望我的输出是这样的:

puloto_cluster_b_02_sys puloto_cluster_b_generic_cg
puloto_cluster_b_02_temp
puloto_cluster_b_04_sys puloto_cluster_b_generic_cg
puloto_cluster_b_04_temp
puloto_cluster_b_06_sys puloto_cluster_b_generic_cg
puloto_cluster_b_08_sys puloto_cluster_b_generic_cg
puloto_cluster_b_10_sys puloto_cluster_b_generic_cg

即将当前记录 ($1) 与下一条记录 ($1) 进行比较,然后仅打印下一条记录。如果不匹配则打印当前的。

答案1

Awk解决方案:

awk '{
         items++;
         if ($1 == f1) { print; items = 0 }
         else if (items == 2) { sub(/^[[:space:]]*/, "", prev); print prev; items-- }
     }
     { prev = $0; f1 = $1 }' file

输出:

puloto_cluster_b_02_sys puloto_cluster_b_generic_cg
puloto_cluster_b_02_temp
puloto_cluster_b_04_sys puloto_cluster_b_generic_cg
puloto_cluster_b_04_temp
puloto_cluster_b_06_sys puloto_cluster_b_generic_cg
puloto_cluster_b_08_sys puloto_cluster_b_generic_cg
puloto_cluster_b_10_sys puloto_cluster_b_generic_cg

答案2

使用该GNU sed工具:

sed -Ee '
   $!N
   /^[[:blank:]]*([^[:blank:]]{1,})([[:blank:]]|\n)(.*\n){0,1}\1([[:blank:]]|$)/D
   s/^[[:blank:]]*//;P;D
'  input_file

解释:

  • $!N将下一行带入模式空间,只要它不是最后一行。
  • /^[[:blank:]]*([^[:blank:]]{1,})([[:blank:]]|\n)(.*\n){0,1}\1([[:blank:]]|$)/D

    • 当前行的第一个字段与下一行的第一个字段匹配,然后从模式空间中砍掉第一行,并使用截断的模式空间返回到 sed 脚本的顶部。
    • OTW,我们打印第一行,然后将其截断并分支回 sed 脚本的顶部,并将 sed 命令应用于截断的模式空间。

输出:

puloto_cluster_b_02_sys puloto_cluster_b_generic_cg
puloto_cluster_b_02_temp
puloto_cluster_b_04_sys puloto_cluster_b_generic_cg
puloto_cluster_b_04_temp
puloto_cluster_b_06_sys puloto_cluster_b_generic_cg
puloto_cluster_b_08_sys puloto_cluster_b_generic_cg
puloto_cluster_b_10_sys puloto_cluster_b_generic_cg

答案3

另一个 awk

awk '{
b=$1
sub("^[[:blank:]]*","")
a=$0
while(getline) {
    if($1!=b)
        print a
    sub("^[[:blank:]]*","")
    a=$0
    b=$1
    }
print a
}' infile

相关内容