【问题标题】:Remove columns from file bash tools从文件 bash 工具中删除列
【发布时间】:2017-08-18 20:51:24
【问题描述】:

我有一个包含大约 200,000 列和大约 5000 行的大文件。 这是该文件的一个简短示例,其中第 1 列和第 5 列重复。

Abf Bgj Csd Daa Abf Efg ...  
0   1   2   1   0   1.1   
2   0.1 1.2 0.3 2   1    
...  

这是我需要的结果示例。原文件第 5 列已被删除。

Abf Bgj Csd Daa Efg ...  
0   1   2   1   1.1    
2   0.1 1.2 0.3 1      
...  

有些列重复了好几次。 我需要使用 bash 工具从数据中删除重复项(保留第一个实例)。 我无法对数据进行排序,因为我需要保持顺序。

【问题讨论】:

  • 格式化您的问题并显示所需的输出
  • 您需要比较每个列的值还是仅列标题就足够了?例如,文件是否可以包含具有相同Abf 标头的不同列?也就是说,存在两种方式:1)遍历文件并删除所有具有相同标题的列;2)遍历文件并删除所有具有相同标题和值的相同列。
  • 我只需要比较列标题。

标签: linux bash awk


【解决方案1】:
$ cat tst.awk
NR==1 {
    for (i=1;i<=NF;i++) {
        if (!seen[$i]++) {
            f[++nf]=i
        }
    }
}
{
    for (i=1;i<=nf;i++) {
        printf "%s%s", $(f[i]), (i<nf?OFS:ORS)
    }
}

$ awk -f tst.awk file | column -t
Abf  Bgj  Csd  Daa  Efg
0    1    2    1    1.1
2    0.1  1.2  0.3  1

【讨论】:

  • 这行得通,完全符合我的需要。你能解释一下这段代码是如何工作的吗?
  • 哪一部分你不明白?
【解决方案2】:

你可以使用datamash程序:

datamash -W transpose < input.txt | datamash rmdup 1 | datamash transpose

GNU datamash 是一个命令行程序,它执行基本的 对输入文本数据的数字、文本和统计操作 文件。

说明:

  1. datamash -W transpose &lt; input.txt
    • 转置 - 交换行和列。现在行是列,列是行。
    • -W - 使用空格(一个或多个空格和/或制表符)作为字段分隔符。
  2. datamash rmdup 1 - 按第一列值删除重复行
  3. datamash transpose - 交换行和列

输入

Abf Bgj Csd Daa Abf Efg
0   1   2   1   0   1.1   
2   0.1 1.2 0.3 2   1

输出

Abf Bgj Csd Daa Efg
0   1   2   1   1.1
2   0.1 1.2 0.3 1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 2012-06-29
    • 2022-12-01
    • 2013-01-03
    • 2018-08-31
    • 1970-01-01
    • 2019-10-20
    相关资源
    最近更新 更多