Сортировка 2-строчного файла.csv с использованием UNIX

#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. хороший подход с < > изменением направления 🙂