这里有一个非常漂亮的方法。
首先格式化内容,使要比较唯一性的列具有固定宽度。一种方法是使用带有字段/列宽度说明符(“%15s”)的awk printf。
现在uniq的-f和-w选项可以用来跳过前面的字段/列,并指定比较宽度(列的宽度)。
这里有三个例子。
在第一个例子中…
1)暂时将感兴趣的列设置为大于或等于字段最大宽度的固定宽度。
2)使用-f uniq选项跳过前面的列,并使用-w uniq选项将宽度限制为tmp_fixed_width。
3)从列中移除尾随空格以“恢复”它的宽度(假设之前没有尾随空格)。
printf "%s" "$str" \
| awk '{ tmp_fixed_width=15; uniq_col=8; w=tmp_fixed_width-length($uniq_col); for (i=0;i<w;i++) { $uniq_col=$uniq_col" "}; printf "%s\n", $0 }' \
| uniq -f 7 -w 15 \
| awk '{ uniq_col=8; gsub(/ */, "", $uniq_col); printf "%s\n", $0 }'
在第二个例子中……
创建一个新的uniq列1。然后在uniq过滤器应用后删除它。
printf "%s" "$str" \
| awk '{ uniq_col_1=4; printf "%15s %s\n", uniq_col_1, $0 }' \
| uniq -f 0 -w 15 \
| awk '{ $1=""; gsub(/^ */, "", $0); printf "%s\n", $0 }'
第三个示例与第二个示例相同,但用于多个列。
printf "%s" "$str" \
| awk '{ uniq_col_1=4; uniq_col_2=8; printf "%5s %15s %s\n", uniq_col_1, uniq_col_2, $0 }' \
| uniq -f 0 -w 5 \
| uniq -f 1 -w 15 \
| awk '{ $1=$2=""; gsub(/^ */, "", $0); printf "%s\n", $0 }'