2016-04-18 2 views
1

Я проверяю несколько столбцов в файле с разделителями каналов. Второй столбец по умолчанию - '*'.Greping asterisk через bash

E.g. данные файла для проверки:

abc|* |123 
def|** |456 
ghi|* |789 

2-я запись имеет 2 звезды из-за ошибочных данных.

Я teied как:

Value_to_match="*" 
unmatch_count=cat <filename>| cut -d'|' -f2 | awk '{$1=$1};1' | grep -vw "$Value_to_match" | sort -n | uniq | wc -l 
echo "unmatch_count" 

Это дает мне считать как 0, тогда как я ожидал 1 (для **), как я использовал -w с Grep, который является точным соответствием и -v, который инвертный матч.

Как я могу grep **?

+0

Также обратите внимание на 'unmatch_count = cat | ... 'не будет работать. Если вы хотите сохранить вывод команды в переменной, скажите 'var = $ (command)'. – fedorqui

+1

Трубы 'cat'' cut' и 'cut'to' awk' и 'awk'' grep' просто сумасшедшие. 'awk -F '\ t' -vx =" $ Value_to_match "'$ 2! = x {a [$ 2] ++} END {для (s в a) printf ("% 8d% s \ n ", a [s ], s} 'filename' (угадывая немного там, что вы на самом деле хотите) – tripleee

+1

Я уже не преподаю shell-скрипты в колледже? Хорошее горе ... –

ответ

1

Проблема здесь grep с учетом ** регулярное выражение. Чтобы избежать этого, используйте -F использовать фиксированные строки:

grep -F '**' file 

Однако, у вас есть неоправданно большой набор водопроводных операций, в то время как в одиночку awk может справиться с этим очень хорошо.

Если вы хотите проверить строки, содержащие ** во второй колонке, говорят:

$ awk -F"|" '$2 ~ /\*\*/' file 
def|** |456 

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

$ awk -F"|" '$2 ~ /\*\*/ {sum++} END {print sum}' file 
1 

Обратите внимание на использование awk:

  • -F"|" установить разделитель полей до |.
  • $2 ~ /\*\*/ сказать: эй, в каждой строке проверить, содержит ли второе поле две звездочки (помните, мы нарезали линии на |). Мы избегаем *, потому что оно имеет особое значение как регулярное выражение.

Если вы хотите вывести эти строки, которые имеют только одну звездочку в качестве второго поля, говорят:

$ awk -F"|" '$2 ~ /^*\s*$/' file 
abc|* |123 
ghi|* |789 

Или проверить для тех, кто не соответствует это регулярное выражение с !~:

$ awk -F"|" '$2 !~ /^*\s*$/' a 
def|** |456 
+0

Я хочу искать только одну звезду, как упоминалось в моем «Value_to_match» переменная. Однако, если я получаю какие-либо ошибочные данные, так как в этом случае я получил «**», это также может быть «***» или какое-то другое значение, которое моя переменная «Value_to_match» должна улавливать.Код работал отлично для других значений, таких как буквенно-цифровое значение или однозначный специальный символ, однако код не смог проверить сценарий «**». – Ishan

+0

@ Ишань ваш вопрос непонятен. Отредактируйте его, опишите, что вы хотите и какой результат вам нужен. Тогда я еще раз проверю. – fedorqui

+0

Мне просто нужно выяснить hte появление ошибочных данных. Я в этом случае должен дать мне результат как 1, но он дает мне 0 – Ishan

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