假设我有一个文件如下:
number 2 6 7 10 number 6 13
name1 A B C D name1 B E
name2 A B C D name2 B E
name3 B A D A name3 A F
name4 B A D A name4 A F
我希望删除完全相同的重复列,输出文件如下所示:
number 2 6 7 10 13
name1 A B C D E
name2 A B C D E
name3 B A D A F
name4 B A D A F
我用sort
和uniq
命令行,但从来不知道如何做的列。谁能建议一个好方法?
5条答案
按热度按时间xam8gpfp1#
下面是使用awk时保持顺序的一种方法
输出
工作原理
型
如果是第一条记录
字段上的循环,
NF
是字段数如果
$i
(包含在字段i
中的数据)出现了不止一次,则向数组a添加一个键为i的元素。对所有记录(包括记录1)执行下一个块。
对于中的每个键,将相应的字段设置为空。
删除多余空格
计算结果始终为true,因此打印所有记录。
vxf3dgd42#
下面的Perl一行程序就可以做到这一点:
-a
将inputfile
的每一行拆分为@F
。文件的第一行用于从左到右构建列索引列表,只保留那些看不见的列。接下来,它打印@F
的切片,其中每行只包含这些列。djmepvbi3#
您可以使用awk:
上面的操作可能会对列进行重新排序,但如果必要的话,可以多做一些工作来修复这个问题。
ahy6op9u4#
只需一个
awk
命令即可删除重复行:它跟踪一条线出现的次数,一旦一条线出现,
a[this row]
等于1,所以当它再次出现时,a[this row]
已经是True,并且!
否定条件,所以它不被打印。在您的例子中,您希望删除重复的列,但是创建一个函数
transpose
来将行转换为列,反之亦然。我在回答Using bash to sort data horizontally时已经这样做了:
然后,它变得微不足道:
型
k2arahey5#
下面是一种完全适用于python3的保序方法
它给出所需的结果:
此外,当将输入的第二行中的第三个字段的值更改为1时,它也给出了正确的结果,因为它没有删除该列,这是因为第3列现在与第7列不同。
型