#unix
#unix
Вопрос:
Мне нужна помощь в сортировке this this .csv Сортировка должна соответствовать первой строке, в которой y и y связаны, поэтому они должны сортироваться вместе и так далее…
y, d, a, w, c,.......
y, d, a, w, c,.......
вывод
a, c ,d ,w ,y
a, c ,d ,w ,y
Спасибо
Комментарии:
1. разве мы не можем написать небольшую Java-программу, которая может читать это и сортировать по своему усмотрению. Если это так, я могу написать его?
2. мне это нужно с помощью сценария оболочки unix :/
Ответ №1:
Если ваш ввод представляет собой довольно прямой список строк, разделенных запятыми, этот список может быть использован tr
и sort
может выполнить эту работу за вас.
$ echo " y, d, a, w, c" | tr , "n" | sort | tr "n" , | sed 's@,$@n@'
a, c, d, w, y
Для более общего решения попробуйте использовать GNU awk
следующее:-
$ cat script.awk
#!/bin/gawk
BEGIN {
FS="," # Setting input-field-separator to ','
OFS="," # Setting output-field-separator to ','
}
{
split($0, words) # Split the strings and store it in array
asort(words) # Using gawk's inherent sort function 'asort' sort the words alphabetically
for (i in words) $i=words[i] # Store the words back in the array and printing the same
print
}
И пример входного файла
$ cat input.csv
pineapple,blueberries,strawberries
pencil,crayon,chalk,marker
bus,car,train,motorcycle,bicycle,skateboard
Запустите скрипт, используя gawk
as
$ gawk -f script.awk input.csv
blueberries,pineapple,strawberries
chalk,crayon,marker,pencil
bicycle,bus,car,motorcycle,skateboard,train
Комментарии:
1. @Johnny: Используйте
gawk
решение в недавнем обновлении2. Сначала мне очень понравился hacky!
3. @SergeBallesta: Будучи давним пользователем, вы можете подтвердить это приятным «голосованием» 🙂 если вы не имели в виду иронию
4. @Inian собирался это сделать (и я уже сделал), но я готовил способ, основанный на вашей работе с многострочными вводами. Не стесняйтесь включать его в свой ответ, если он вам нравится, и пингуйте меня, чтобы я мог удалить свой.
5. @SergeBallesta: Приветствую!
Ответ №2:
Вот способ, основанный на оригинальном ответе Иниана — кредиты должны остаться ему…
while true
do read line
if [ "x${line}" == "x" ]
then break
else
echo $line | tr , "n" | sort | tr "n" ,
echo
fi
done
Просто используйте его таким образом: line_sort.sh < orig_file > sorted_file
Отказ от ответственности: это работает только для очень простого csv. CSV, созданный с помощью электронных таблиц, может быть намного сложнее, поскольку CSV может поддерживать новые строки и запятые внутри полей. Если бы я хотел надежное решение, я бы использовал true language и библиотеку CSV. Python поставляется с отличным CSV-модулем…
Комментарии:
1. хороший подход с
< >
изменением направления 🙂