2012-06-26 3 views
0

У меня есть файл, который мне нужно проанализировать в массиве, но я действительно хочу только короткую часть каждой строки и только для первых 84 строк. Иногда линия может быть:Bash считывает файл в массив на основе двух разделителей

>MT gi... 

И я просто хочу МТ, чтобы ввести в массив. В других случаях это может быть что-то вроде этого:

>GL000207.1 dn... 

и мне нужно бы GL000207.1

Я думал, что вы могли бы быть в состоянии установить два разделителей (один являющийся «>», а другой являясь «пробелом»), но я не уверен, как вы это сделаете. Я прочитал записи других людей о внутреннем разделителе полей, но я действительно не уверен, как это будет работать. Я думаю, возможно, что-то вроде этого может работать?

desiredArray=$(echo file.whatever | tr ">" " ") 
for x in $desiredArray 
do 
    echo > $x 
done 

Любые предложения?

+0

Вы пробовали 'cut'? – Wrikken

+0

Uh. Нет. Я только что начал с Баша, как ... неделю назад. Я пытаюсь изучить его для своей работы. Как вы используете вырез? – Stephopolis

+0

Оболочка, как правило, плохо при обработке текста. Вы могли бы запутаться с 'IFS', но вам лучше использовать' cut', как предложено, или 'awk' или' perl'. – msw

ответ

2

Как насчет:

head -84 <file> | awk '{print $1}' | tr -d '>' 

head занимает только первые строки файла, awk срывает первое место и все, что после него, и tr избавляется от «>».

+0

Так что, по сути, эта строка кода говорит ... С начала по строке 84 определенного файла, возьмите все перед пробелом и удалите>? – Stephopolis

+0

Это в значительной степени идея, да. Хотя, если есть строки, в которых вы не хотите всего первого поля (минус «>»), вам понадобятся дополнительные правила, но оба случая, упомянутые в исходном вопросе, будут решены с помощью этого шаблона. – twalberg

+0

Я не уверен, как это работает как массив. Как бы вы ссылались на значения в более поздней точке? – Stephopolis

0

Вы также можете сделать это с СЕПГ:

head -n 84 <file> | sed 's/>\([^ ]*\).*/\1/' 
+0

За исключением 'tail -n 84 ' дает * последние * строки файла, а не * первые *. – twalberg

+0

o дорогой :) не уверен, почему я ввел хвост ... исправлено сейчас. Спасибо за указание. – bcelary

+0

не беспокоится ... большинство из нас использует 'tail' намного больше, так что это естественная ошибка ... – twalberg