Помощь с командой sed

Вы можете попробоватьawk:

awk -F'\t' '!($2 == "NA" && $3 == "NA")' file

Опция -Fустанавливает разделитель полей в \t, позволяя захватить 2-й и 3-й параметр и проверить, не является ли их содержимое NA. В таком случае awkпечатает строку.

0
11.11.2021, 00:46
2 ответа

Можно было бы использовать 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
3
11.11.2021, 05:43

Если вы хотите упорядочить игры в алфавитном порядке по названию, вы можете сделать это напрямую с помощью 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
1
11.11.2021, 08:37

Теги

Похожие вопросы