Извлечь линии, когда столбец K пуст с AWK/Perl

У меня есть данные, которые выглядят так:

foo 78 xxx
bar    yyy
qux 99 zzz
xuq    xyz

Они ограничены табуляцией. Как я могу извлечь строки, где столбец 2 пуст, что дает

bar    yyy
xuq    xyz

Я пробовал это, но, похоже, не работает:

awk '$2==""' myfile.txt 

Ответы

Ответ 1

Вам нужно специально установить разделитель полей на символ TAB:

> cat qq.in
  foo     78      xxx
  bar             yyy
  qux     99      zzz
  xuq             xyz
> cat qq.in | awk 'BEGIN {FS="\t"} $2=="" {print}'
  bar             yyy
  xuq             xyz

Поведение по умолчанию для awk - это обращение к FS SPACE (по умолчанию) в качестве специального случая. На странице man:

В специальном случае, когда FS является одним пространством, поля разделяются пробелами пробелов и/или вкладок и/или строк новой строки. (курсив мой)

Ответ 2

perl -F/\t/ -lane 'print unless $F[1] eq q//' myfile.txt

Переключатели команд

  • -F сообщает Perl, какой разделитель авторасширить (вкладки в этом случае)
  • -a включает режим авторасщепления, разбивая каждую строку на указанном разделителе для заполнения массива @F
  • -l автоматически добавляет новую строку "\n" в конце каждой печатной строки
  • -n обрабатывает файл по строкам
  • -e обрабатывает первый цитируемый аргумент как код, а не имя файла

Ответ 3

grep -e '^.*\t\t.*$' myfile.txt

Будут grep каждой строки, состоящей из символов-tab-tab-characters (ничего между вкладками).