2016-09-17 5 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 & столбец I grep'd. Я знаю, что я могу использовать cut -f1 myfile для первого бита, но мне нужна помощь с grep за столбец. В качестве более конкретного примера, если моя 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

Вы задали имя столбца имени одного из заголовков? Когда часть до тех пор, пока первый канал не покажет строку заголовка без каких-либо изменений с именем столбца taht past, работает. Теперь посмотрим на второе 'sed'. Разделяются ли ваши поля вкладками?Когда у вас есть переменное количество пробелов, будет трудно распознать их между полями заголовка с пространством внутри, например 'this one' или' nr of errors'. –

2

Вы должны использовать AWK:

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

Эта простая команда позволяет выполнять печать первой ($ 1) и третьего ($ 3) столбец файла. Программный awk на самом деле намного более мощный. Я думаю, вам стоит взглянуть на страницу man awk.

Хорошая комбинация использует grep и awk с трубой. Следующий код будет печатать колонку 1 и 3 только строки файла, которые содержат «p1»:

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

Если, вместо этого, вы хотите, чтобы выбрать строки по номеру строки, вы можете заменить 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 
+0

Спасибо! Это очень полезно. Может ли awk использоваться просто для возврата столбцов с grep, когда вы не знаете номер столбца, но знаете имя столбца? – AMS

Смежные вопросы