Вопрос или проблема
У меня есть этот файл
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
Применение
Для корректной сортировки необходимо изменить подход к обработке и учесть наличие пробелов. Одним из методов решения проблемы является использование другой утилиты или модификация текущего подхода.
-
Использование awk для обработки всего предложения:
Убедитесь, чтоawk
правильно обрабатывает поля внутри кавычек как одно поле. Ваша команда для сортировки текста может использоватьawk
функцию, чтобы корректно обходить текст в кавычках и пробелами. -
Переписывание команды:
Перепишите ваш код, чтобы учесть строки с пробелами, разбивая их на две команды, и затем объединяя отфильтрованные данные:
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
, который собирает поля со второго до последнего (чтобы захватить текстовые данные целиком). Этот способ позволяет сохранить целостность строк с пробелами. Затем вы просто объединяете отсортированные столбцы обратно.
- Удаление временных файлов:
Убедитесь, что временные файлы очищены после завершения:
rm sorted_nums.txt sorted_strings.txt
Заключение
Это решение позволяет избежать проблемы с сохранением строковых значений, содержащих пробелы, при использовании Unix-команд для сортировки. Во многом решение зависит от правильной интерпретации и обработки данных, обеспечивая, чтобы awk
или другая утилита корректно распознавали и работали с вашими строками, даже если они включают пробелы. Это подход предоставляет более гибкий и надежный способ работы с текстовыми данными в Unix-системах.