使用grep提取列

AMS*_*AMS 9 unix grep

我有一个数据框,其中包含> 100列,每列均标有唯一字符串。第1列代表索引变量。我想用一个基本的UNIX命令提取索引列(列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
Run Code Online (Sandbox Code Playgroud)

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

Index  B
p1     7
p2     2
p3     3
Run Code Online (Sandbox Code Playgroud)

我是UNIX的新手,在类似示例中找不到很多东西。任何帮助将非常感激!!

Ric*_*lia 7

您需要使用awk:

awk '{print $1,$3}' <namefile>
Run Code Online (Sandbox Code Playgroud)

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

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

grep 'p1' <namefile> | awk '{print $1,$3}'
Run Code Online (Sandbox Code Playgroud)

相反,如果要按行号选择行,则可以用sed替换grep:

sed 1p <namefile> | awk '{print $1,$3}'
Run Code Online (Sandbox Code Playgroud)

实际上,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
Run Code Online (Sandbox Code Playgroud)

  • 谢谢!这非常有帮助。当您不知道列号但知道列名时,可以使用 awk 简单地使用 grep 返回列吗? (2认同)

Wal*_*r A 5

首先找出命令以查找列号。

columnname=C
sed -n "1 s/${columnname}.*//p" datafile | sed 's/[^\t*]//g' | wc -c
Run Code Online (Sandbox Code Playgroud)

一旦知道号码,就使用cut

cut -f1,3 < datafile 
Run Code Online (Sandbox Code Playgroud)

合并为一个命令

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

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