2016-09-17 263 views
3

我有一个数据框,每列有100列,每列标有一个唯一的字符串。列1代表索引变量。我想使用基本的UNIX命令来提取索引列(第1列)+使用grep的特定列字符串。使用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列&列我grep'd。我知道我可以在第一位使用cut -f1 myfile,但需要grep per column的帮助。作为一个更具体的例子,如果我的grep的短语是“B”,我想输出是:

Index B 
p1  7 
p2  2 
p3  3 

我是新来的UNIX,并没有类似的例子很多发现。任何帮助将非常感激!!

+2

看看awk。 –

+0

通过在第二行中输入像“p1a p1b p1c ... p1f”这样的值,可以使问题更加清晰。 –

+0

完成!列中的值(在标题旁)与搜索无关。 – AMS

回答

3

首先弄清楚的命令来查找列数。

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

一旦你知道电话号码,使用切

cut -f1,3 < datafile 

组合到一个命令

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

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

+0

非常感谢。无论如何设置我的列名,第一个sed输出“1”这个命令有问题吗? – AMS

+0

您是否将columnname设置为其中一个标题的名称?当直到第一个管道的部分显示标题行时,没有任何与columnname taht过去的内容正在工作。现在看第二个'sed'。你的领域是否与标签分开?当你有可变数量的空格时,很难在内部有空格的头字段之间识别它们,比如'this one'或'nr of errors'。 –

2

你需要用awk:

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

这个简单的命令允许打印第一($ 1)和第三($ 3)文件的列。 awk软件实际上更加强大。我想你应该看看awk的man page。

一个很好的组合使用grep和awk与管道。下面的代码将只打印包含“P1”的文件的行列1和3:相反,如果你想选择的行号线可以用SED替代的grep

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

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 
+0

谢谢!这非常有帮助。当你不知道列号而是知道列名时,awk可以简单地用grep返回列吗? – AMS