unix 使用grep提取列

mwngjboj  于 12个月前  发布在  Unix
关注(0)|答案(3)|浏览(133)

我有一个数据框,其中包含>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

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

Index  B
p1     7
p2     2
p3     3

我是UNIX新手,没有发现很多类似的例子。如有任何帮助,我们将不胜感激!!

x4shl7ld

x4shl7ld1#

使用awk:

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

这个简单的命令允许打印文件的第一列($1)和第三列($3)。awk软件实际上要强大得多。我想你应该看看awk的手册页。
一个很好的组合是使用grep和awk与管道。下面的代码将只打印文件中包含'p1'的行的第1列和第3列:

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

相反,如果你想通过行号选择行,你可以用sed代替grep:

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
6ovsh4lw

6ovsh4lw2#

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

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命令:在匹配中包含制表符,并将制表符放回替换字符串中。

oaxa6hgo

oaxa6hgo3#

如果你想保留第一列和第一行中包含特定字符串的列(例如,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)中,它遍历所有列(i=1; i<=NF;i++)直到找到字符串,保存列号,然后打印它。如果你想把字符串作为变量传递,那么你可以使用-v选项。

相关问题