【发布时间】:2021-11-07 07:13:07
【问题描述】:
我有一个包含 7 个制表符分隔列的文本文件。每列都有不同数量的行,其中的值可以重复。我想删除重复项,以便每列只有该特定列的唯一值。举个例子:
输入
C1 C2 C3 C4 C5 C6 C7
111 111 222 333 111 222 777
222 111 333 333 222 333 666
222 111 444 111 333 555 555
333 444 555 222 444 666 444
444 666 555 777 555 666 333
444 777 777 555 666 888 333
777 888 999 666 888
999
输出
C1 C2 C3 C4 C5 C6 C7
111 111 222 333 111 222 777
222 444 333 111 222 333 666
333 666 444 222 333 555 555
444 777 555 777 444 666 444
777 888 777 555 555 888 333
999 999 666 666
888
我想我需要使用 awk 来打印每一列并单独使用 sort -u,然后将这些输出粘贴在一起。那么,有没有一种方法可以创建一个循环,对于文本文件中的 i 列,将打印每一列 | sort - u,然后将它们全部粘贴在一起?
提前致谢, 卡洛斯
【问题讨论】:
-
转置,然后在行中制作唯一编号,然后再次转置。
-
paste <(awk '!seen[$1]++ && $0=$1' file) <(awk '!seen[$2]++ && $0=$2' file) <(awk '!seen[$3]++ && $0=$3' file) <(awk '!seen[$4]++ && $0=$4' file) <(awk '!seen[$5]++ && $0=$5' file) <(awk '!seen[$6]++ && $0=$6' file) <(awk '!seen[$7]++ && $0=$7' file);-) -
谢谢@Cyrus,它适用于这个特定的文件。但是,将来我将使用具有随机列数的文件来执行此操作。有没有办法做类似的事情: for i columns do paste
-
@Carlos Cyrus 是在开玩笑,请注意他们评论末尾的笑脸表情符号。
-
@EdMorton:是的,我已经看到灾难即将到来,它不会停留在 7 列。