我的输入文件是:
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