【问题标题】:Cut file by column titles matching lines in a text file [duplicate]按与文本文件中的行匹配的列标题剪切文件[重复]
【发布时间】:2022-01-01 06:11:06
【问题描述】:

我有两个文件,一个包含多列的大文本文件,格式如下:

Col1 Col2 A B C D G H I L N Q S ...
1    0    1 0 1 0 1 0 1 0 1 0 1 ...
0    2    1 0 0 0 0 0 2 1 2 3 4 ...
...

和一个包含要匹配的列的文本文件

Col1
Col2
Col3 
B
D
F
...

(请注意,此文件中的某些行可能与大 tsv 文件中的列标题不匹配)

我想根据与文件中给定的列标题匹配的列标题剪切大文件(忽略列标题或文本文件中不匹配的列标题,因此输出文件列标题以Col1 Col2 B D ...开头)

有没有一种简单的方法可以做到这一点,而不是遍历第二个文本文件中的每一行并使用paste 构建一个文件?

这是在 Mac OS X 上,所以使用 ksh,虽然可以使用纯 bash

【问题讨论】:

    标签: bash ksh


    【解决方案1】:

    然后从 homebrew (brew install miller) 安装 miller 然后

    mlr --ipprint --oxtab cat large.txt \
    | grep -f <(sed 's/^/^/; s/\./\\./g' cols.txt; echo '^$') \
    | mlr --ixtab --opprint cat
    
    Col1 Col2 B D ...
    1    0    0 0 ...
    0    2    0 0 ...
    

    或者,使用普通的 awk

    awk '
      NR==FNR {col[$1]; next}
      FNR == 1 {for (i=1; i<=NF; i++) if ($i in col) wanted[i] = 1}
      {
        for (i=1; i<=NF; i++) if (wanted[i]) printf "%s%s", $i, OFS
        print ""
      }
    ' cols.txt large.txt
    
    Col1 Col2 B D ...
    1 0 0 0 ...
    0 2 0 0 ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-16
      • 2020-03-03
      • 2013-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多