2016-09-17 267 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