2014-01-31 4 views
1

В файле (с разделителем табуляции текст, CSV или файл базы данных) вы имеете имя, фамилию и адрес. В некоторых строках у вас нет фамилии, но имя и адрес есть. Как вы можете перечислить строки, имена которых пусты, используя команду UNIX?Команда UNIX для поиска пустого слова

Имя Фамилия Улица Город Дэн, Бог, первая улица, Чикаго Сэм, второй Street, Чикаго Адам Смит, 3rd Street, Чикаго

Это может быть CSV, табуляцией текстовый файл (;, :). ответ должен быть 2-го ряда выше.

+1

Как разделяются имена? –

+1

Показать образцы строк из входного файла. – anubhava

+0

текст с разделителями табуляции или CSV или файл базы данных, это может быть любой файл, который мы использовали в процессе ETL. – Dangod

ответ

2

Предполагая, что входной файл CSV, вы можете использовать AWK:

awk -F, '$2 == ""' file 

в напечатайте все строки, где 2 столбца (фамилия) пустые.

+2

Спасибо очень много. Это работает.Для файла с разделителями табуляции я использовал awk -F '\ t' '$ 2 == ""' файл, который работал – Dangod

+0

Замечательно, можете ли вы пометить ответ, как принято сейчас. – anubhava

1

Попробуйте это:

awk 'NF!=3' file 

печатает все строки, где число полей не 3.

+0

Это короткий и сладкий. Мне нравится ваш ответ. Большое спасибо. – Dangod

1

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

Вот образец текста я использую:

06:33:20 0 1 [email protected]:/tmp$ cat sample.csv 
first,last,address,otherstuff 
first,,address,otherstuff 
first,last,, 

Простой grep ,, не работает, поскольку она также находит последнюю строку:

06:33:22 0 0 [email protected]:/tmp$ grep ,, sample.csv 
first,,address,otherstuff 
first,last,, 

Поскольку первое поле имя первым на линии, мы можем немного упростить проблему: мы хотим найти места, где первая запятая на линии сразу же следует за второй запятой.

06:35:07 0 0 [email protected]:/tmp$ grep "^[^,]*,," sample.csv 
first,,address,otherstuff 

В этом регулярном выражении, первые ^ якоря регулярного выражения к началу строки; [^,]* соответствует 0 или более вхождений любого символа, кроме запятой (да, ^ делает что-то совсем другое в этом контексте), и, наконец, ,, соответствует двум запятым.

Если вы хотите, чтобы 3-е поле было пустым, вам нужно будет немного повториться.

06:35:28 0 0 [email protected]:/tmp$ grep "^[^,]*,[^,]*,," sample.csv 
first,last,, 

Здесь вы ищете 0 или более символов без запятой, а затем через запятую, а затем 0 или более не запятые, а затем двумя запятыми.

+0

Большое спасибо за ваш ответ, и это намного более полезно, и я получил более продвинутые знания по команде grep. Еще раз спасибо. – Dangod

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