Вы можете попробоватьawk
:
awk -F'\t' '!($2 == "NA" && $3 == "NA")' file
Опция -F
устанавливает разделитель полей в \t
, позволяя захватить 2-й и 3-й параметр и проверить, не является ли их содержимое NA
. В таком случае awk
печатает строку.
Можно было бы использовать sed
для извлечения нужных данных, но это было бы излишне сложным упражнением, поскольку awk
лучше подходит для работы с данными, которые могут быть организованы в записи (строки )состоящий из полей (столбцов ). Трудность заключается в том, чтобы придумать регулярное выражение для сопоставления 4-го столбца, а затем определить, является ли это целым числом в правильном диапазоне. Помимо того, что он ужасен при подсчете и обработке целых чисел как всего, кроме строк отдельных цифр,sed
паршив, когда дело доходит до сортировки .
Предполагая, что данные разделены табуляцией -(и что "алфавитизация" означает "отсортировано в лексикографическом порядке"):
awk -F '\t' '$4 >= 1980 && $4 < 1990' file | sort -k 2
При этом используется awk
для извлечения строк, чья 4-я вкладка -разделяет поле (год )представляет собой число между 1980 и 1989. Результирующие строки затем сортируются в лексикографическом порядке по второму пробелу -поле с разделителями (заголовок, а остальная часть строки ).
Если файл разделен пробелами, вы можете попробовать использовать любую последовательность из двух или более пробелов в качестве разделителя вместо табуляции:
awk -F ' {2,}' '$4 >= 1980 && $4 < 1990' file | sort -b -k 2
Обратите внимание на параметр -b
, используемый здесь с sort
. Необходимо игнорировать начальные пробелы второго поля. Это не требуется, если разделителями в данных являются одиночные табуляции.
Результат, который я получаю с вашими данными в вопросе:
3 Duck Hunt NES 1985 Nintendo 26.93
2 Super Mario Bros. NES 1985 Nintendo 29.08
13 Super Mario Land GB 1989 Nintendo 10.83
4 Tetris GB 1989 Nintendo 23.20
Если вы хотите упорядочить игры в алфавитном порядке по названию, вы можете сделать это напрямую с помощью sort
. Здесь я выбрал #
в качестве разделителя полей, потому что его нет в наборе данных.
Во-первых, вам нужно выбрать игры 1980-х годов, поэтому я использовал grep
для этого :
grep -E '^.{39}198.' games | sort -t'#' -k1.5,1.34
Вывод из вашего примера:
3 Duck Hunt NES 1985 Nintendo 26.93
2 Super Mario Bros. NES 1985 Nintendo 29.08
13 Super Mario Land GB 1989 Nintendo 10.83
4 Tetris GB 1989 Nintendo 23.20