2014-08-27 2 views
1

Я пытаюсь прочитать userinput, сопоставить первое поле файла csv и распечатать всю строку. Вот что я придумал:строка печати, которая соответствует первому полю (bash)

#/bin/bash 
echo "enter number: " 
read USERINPUT 
LINENUMBER=$(awk -v FS=',' '{print $1}' < test.csv | grep -n "$USERINPUT") 
FULLLINE=$(sed -n $LINENUMBER\p test.csv) 
echo $FULLLINE 

Проблема я бегу в это сказать я установить UserInput = 4, но мой файл CSV имеет несколько линий, как 4, 421, 444, и т.д .. я соответствует всем из них. Как я могу сделать

grep -n "$USERINPUT" 

только соответствует тому, что он настроен, и ничего больше?

+5

выходите из привычки использовать ALL_CAPS_VARNAMES: однажды вы напишете 'PATH = foo', а затем задаетесь вопросом, почему ваш скрипт сломан. –

+0

Grep поддерживает '\ <' для 'границы левого слова' и '\>' для 'границы правильного слова'. Найдите '\ <4\>', чтобы найти только «4» без захвата '421',' 444' и т. Д. – OnlineCop

ответ

3

Вместо печати первый столбец каждой строки, а затем с помощью grep, вы должны просто делать все это в AWK:

line_number=$(awk -F, -v s="$number" '$1==s{print NR}' test.csv) 

Если вы просто хотите, чтобы напечатать строку, то просто:

awk -F, -v s="$number" '$1==s' test.csv 

Кстати, вместо использования echo с последующим read, вы можете использовать read -p, который позволяет указать подсказку:

read -p "enter number: " number 
+0

спасибо! я знал, что могу сделать все это в awk, но мой awkfoo - слабый соус. очень признателен. – dobbs

+0

Что делать, если строка в тесте похожа на «мой 4 вход, больше информации». И пользовательский ввод - '4'. Это не ударит, так как split by ',' даст '$ 1' =' my 4 input'. – Jotne

+0

@Jotne Из вопроса выяснилось, что поле будет всего лишь «4». –

3
#/bin/bash 
read -p "enter number: " num 
grep "^$num," test.csv 
+0

Возможно, вы должны сделать это 'egrep '^ $ num (, | $)", чтобы он работал, даже когда в файле было всего 1 поле, и вы даже можете использовать 'egrep'^($ num) (, | $) ", если вы хотите, чтобы пользователь мог указать несколько строк одновременно с' 3 | 7 | 12' или '3 *' или ... –

0

Опция -o grep печатает только то, что соответствует регулярному выражению.

E.g.

grep -o '.*USERINPUT.*' 

или

grep -o '^USERINPUT.*' 

т.д.

0
#/bin/bash 
echo "enter number: " 
read USERINPUT 
# for a var assignation and print content 
FULLLINE=$(egrep "^${USERINPUT%% *}," test.csv) 
echo $FULLLINE 
# for only a print 
egrep "^${USERINPUT%% *}," test.csv 
  • Использование для включения задать расширенное deleimiter (линию старта и кома вокруг входа)
  • Использование теста небольшой входной удаление заднего пространства через ${VarName%% *}
Смежные вопросы