【问题标题】:Extract column using grep使用 grep 提取列
【发布时间】:2017-01-25 20:49:24
【问题描述】:

我有一个包含 >100 列的数据框,每列都标有唯一的字符串。第 1 列代表索引变量。我想使用一个基本的 UNIX 命令来提取索引列 (column 1) + 使用grep 的特定列字符串

例如,如果我的数据框如下所示:

Index  A  B  C...D  E  F
p1     1  7  4   2  5  6
p2     2  2  1   2  .  3
p3     3  3  1   5  6  1

我想使用一些命令仅提取我将使用grep 指定的列“X”,并显示第 1 列和我grep'd 的列。我知道我可以将cut -f1 myfile 用于第一位,但在每列grep 方面需要帮助。作为一个更具体的例子,如果我的grep 短语是“B”,我希望输出是:

Index  B
p1     7
p2     2
p3     3

我是 UNIX 新手,在类似示例中没有发现太多。任何帮助将不胜感激!

【问题讨论】:

  • 看看awk。
  • 您可以通过在第二行输入p1a p1b p1c...p1f 等值来使您的问题更清晰。
  • 完成!列(标题旁边)中的值与搜索无关。

标签: unix grep


【解决方案1】:

如果您想保留第一列和第一行中包含特定字符串的列(例如B),那么这应该可以。它假定您的字符串只出现一次。

awk '{if(NR==1){c=0;for(i=1;i<=NF;i++){c++;if($i=="B"){n=c}}}; print $1,$n}' myfile.txt

可能有一个更好的解决方案,具有惊人的 awk,但这应该可以工作。

解释:在第一行 (NR==1) 中,它遍历所有列 for(i=1;i

【讨论】:

    【解决方案2】:

    先弄清楚找到列号的命令。

    columnname=C
    sed -n "1 s/${columnname}.*//p" datafile | sed 's/[^\t*]//g' | wc -c
    

    知道数字后,使用 cut

    cut -f1,3 < datafile 
    

    合并成一个命令

    cut -f1,$(sed -n "1 s/${columnname}.*//p" datafile | 
       sed 's/[^\t*]//g' | wc -c) < datafile
    

    完成了吗?不,当一个标题可以是另一个标题的子字符串时,您应该改进第一个 sed 命令:在匹配中包含制表符并将制表符放回替换字符串中。

    【讨论】:

    • 非常感谢。这个命令有问题,无论我如何设置列名,第一个 sed... 都会输出“1”?
    • 您是否将 columnname 设置为标题之一的名称?当直到第一个管道的部分显示标题行时没有任何列名过去的内容正在工作。现在看第二个sed。您的字段是否用制表符分隔?当您有可变数量的空格时,很难在带有空格的标题字段之间识别它们,例如this onenr of errors
    【解决方案3】:

    你需要使用awk:

    awk '{print $1,$3}' <namefile>
    

    这个简单的命令允许打印文件的第一 ($1) 和第三 ($3) 列。软件 awk 实际上要强大得多。我认为你应该看看 awk 的手册页。

    一个不错的组合是使用带有管道的 grep 和 awk。以下代码将仅打印文件中包含“p1”的行的第 1 列和第 3 列:

    grep 'p1' <namefile> | awk '{print $1,$3}'
    

    如果您想按行号选择行,则可以将 grep 替换为 sed:

    sed 1p <namefile> | awk '{print $1,$3}'
    

    其实awk在所有例子中都可以单独使用:

    awk '/p1/{print $1,$3}' <namefile> # will print only lines containing p1
    awk '{if(NR == 1){print $1,$3}}' <namefile> # Will print only first line
    

    【讨论】:

    • 谢谢!这很有帮助。当您不知道列号但知道列名时,是否可以使用 awk 简单地返回带有 grep 的列?
    • @Riccardo Petraglia: 解决方案grep 'p1' &lt;namefile&gt; | awk '{print $1,$3}' 如果我只需要 $3 的前三个字符怎么办?
    猜你喜欢
    • 2021-03-22
    • 1970-01-01
    • 2013-09-09
    • 1970-01-01
    • 1970-01-01
    • 2017-03-05
    • 1970-01-01
    • 2021-06-04
    • 1970-01-01
    相关资源
    最近更新 更多