Своего рода сортировка разной колонки с использованием разных типов работает, единственное странное с пробелами.

Вопрос или проблема

У меня есть этот файл

1  you
3  me
2  their
4  us

эта команда работает хорошо (она сортирует первую колонку по числам, вторую по буквам), это команда другого пользователя найдена здесь

paste <(awk '{print $1}' file.txt | sort -k1n) <(awk '{print $2}' \
file.txt | gsort -V)

но теперь использую слово с пробелами

1  "and me"
3  me
2  their
4  us

Та же команда дает это

1   me
2   their
3   us
4   "and

Как получить такой результат?

1   and me
2   their
3   us
4

Я попробовал:

  • удалить номер 4

  • использовать “and me”

  • использовать ‘and me’

Но получаю неправильный результат

.

Ответ или решение

Для решения проблемы сортировки столбцов в файле, который содержит строки, как в вашем примере, необходимо учитывать особенности работы UNIX-подобных систем с текстовыми данными, особенно когда есть пробелы в данных, которые нужно сортировать.

Теория

Одной из основных функций Unix утилит, таких как sort, является сортировка данных в текстовых файлах. Вообще говоря, sort сортирует строки в файле на основе одного или нескольких ключевых столбцов. Однако, когда вашей целью является сортировка данных с учетом различных типов содержимого в разных столбцах (цифры в одном и текст в другом), эта задача может стать немного сложнее.

В вашей ситуации, у вас есть проблема с обработкой строк, которые содержат пробелы в "текстовых" столбцах. Команда paste, которую вы используете, может разделять столбцы с учетом пробелов, что приводит к тому, что данные обрабатываются неверно: строки с пробелами не рассматриваются как единое целое.

Пример

Вот текущий пример ваших данных:

1  you
3  me
2  their
4  us

Используемая команда:

paste <(awk '{print $1}' file.txt | sort -k1n) <(awk '{print $2}' file.txt | sort -V)

Если добавить строку с пробелом:

1  "and me"
3  me
2  their
4  us

Команда генерирует:

1   me
2   their
3   us
4   "and

Применение

Для корректной сортировки необходимо изменить подход к обработке и учесть наличие пробелов. Одним из методов решения проблемы является использование другой утилиты или модификация текущего подхода.

  1. Использование awk для обработки всего предложения:
    Убедитесь, что awk правильно обрабатывает поля внутри кавычек как одно поле. Ваша команда для сортировки текста может использовать awk функцию, чтобы корректно обходить текст в кавычках и пробелами.

  2. Переписывание команды:
    Перепишите ваш код, чтобы учесть строки с пробелами, разбивая их на две команды, и затем объединяя отфильтрованные данные:

awk '{print $1}' file.txt | sort -k1n > sorted_nums.txt
awk '{for (i=2; i<=NF; i++) printf $i""FS; print ""}' file.txt | sort > sorted_strings.txt
paste sorted_nums.txt sorted_strings.txt

Здесь мы используем awk, чтобы обойти обработку полей путем обмена полей с помощью цикла for, который собирает поля со второго до последнего (чтобы захватить текстовые данные целиком). Этот способ позволяет сохранить целостность строк с пробелами. Затем вы просто объединяете отсортированные столбцы обратно.

  1. Удаление временных файлов:
    Убедитесь, что временные файлы очищены после завершения:
rm sorted_nums.txt sorted_strings.txt

Заключение

Это решение позволяет избежать проблемы с сохранением строковых значений, содержащих пробелы, при использовании Unix-команд для сортировки. Во многом решение зависит от правильной интерпретации и обработки данных, обеспечивая, чтобы awk или другая утилита корректно распознавали и работали с вашими строками, даже если они включают пробелы. Это подход предоставляет более гибкий и надежный способ работы с текстовыми данными в Unix-системах.

Оцените материал
Добавить комментарий

Капча загружается...