Справка по простому linux-скрипту - PullRequest
0 голосов
/ 14 апреля 2011

У меня есть текстовый файл со следующей структурой:

text1;text2;text3;text4
...

Мне нужно написать скрипт, который получает 2 аргумента: столбец, в котором мы хотим искать, и контент, который мы хотим найти.

Таким образом, скрипт должен выводить только строки ( ВСЕ ЛИНИИ! ), которые соответствуют содержимому (arg2), найденному в столбце x (arg1).

Я пробовал с egrep и sed, но у меня недостаточно опыта, чтобы закончить. Буду признателен за руководство ...

Ответы [ 5 ]

4 голосов
/ 14 апреля 2011

Учитывая вашу добавленную информацию о необходимости вывода всей строки, awk является самым простым:

awk -F';' -v col=$col -v pat="$val" '$col ~ pat' $input

Объясняя выше, опции -v устанавливают переменные awk, не беспокоясь о кавычкахпроблемы в теле скрипта awk.Pre-POSIX версии awk не понимают параметр -v, но распознают присвоение переменной без него.Опция -F устанавливает разделитель полей.В теле мы используем шаблон с действием по умолчанию (которое print);шаблон использует переменные, которые мы установили с помощью -v как для столбца ($ есть оператор «индекса поля» awk, а не переменная оболочки), так и для шаблона (и pat действительно может содержать awk в стиле регулярных выражений).

1 голос
/ 14 апреля 2011

Python

 #!/usr/bin/env python
 import sys
 column = 1 # the column to search
 value = "the data you're looking for"
 with open("your file","r") as source:
    for line in source:
        fields = line.strip().split(';')
        if fields[column] == value:
             print line
1 голос
/ 14 апреля 2011
cat text_file.txt| cut -d';' column_num | grep pattern

Печатается только соответствующий столбец, а не вся строка. позвольте мне подумать, если есть простое решение для этого.

0 голосов
/ 18 апреля 2012
grep -B1 -i "string from previous line" |grep -iv 'check string from previous line' |awk -F" " '{print $1}'

Это напечатает вашу строку.

0 голосов
/ 15 апреля 2011

Существует также решение с egrep. Это не очень красиво, но работает:

egrep "^([^;]+;){`expr $col - 1`}$value;([^;]+;){`expr 3 - $col`}([^;]+){`expr 4 - $col`}$" filename

или даже короче:

egrep "^([^;]+;){`expr $col - 1`}$value(;|$)" filename
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...