Как сортировать по строке из терминала

Я смотрел на этот вопрос и задавался вопросом, можно ли сделать следующее из терминала. Я сделал это на python, просто хочу посмотреть, можно ли это сделать с помощью терминала, скриптов bash или чего-то еще.

Предположим, у меня есть файл, который выглядит следующим образом:

2,4,5,14,9
40,3,5,10,1

может ли он быть отсортирован по строкам (строкам)

2,4,5,9,14
1,3,5,10,40

или он слишком сложный? Я сделал это с помощью Python, я просто хочу знать, можно ли это сделать, чтобы в следующий раз я не использовал Python. То, что я сделал, - это создание списков и их сортировка.

7
задан 13 April 2017 в 15:24

9 ответов

Вот другой подход Perl:

perl -F, -lane 'print join ",",sort {$a<=>$b} @F' file.txt

И другой shell/coreutils один (хотя лично, я предпочитаю steeldriver's превосходный ответ , который использует ту же идею):

while read line; do 
    tr , \n' < <(printf -- "%s" "$line") | sort -g | tr \n' , | sed 's/,$/\n/';
done < file.txt
0
ответ дан 13 April 2017 в 15:24

Это должно сделать, о каком Вы ищете. Это считает файл (test.txt) и создаст выходной файл (sorted.txt) с отсортированными строками в том же порядке, как они появляются в исходном файле.

while read line; do j=$(echo "$line" | sed -e 's/,/\n/g' | sort -n); echo "$j" 
    | sed -e 's/ /,/g' >> sorted.txt; done < test.txt
0
ответ дан 13 April 2017 в 15:24

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

существует много доступных утилит обработки текста, которые позволили бы Вам делать это (включая sed, awk, или даже простое tr) однако, сама оболочка удара может сделать много в наше время. Принятие Вас означало для входа быть разграниченным запятой (у Вас есть соединение запятых и пробельных разделителей в Вашем примере), Вы могли сделать:

while read line; do 
  sorted=$(sort -g -- <<< "${line//,/ 

, Если Вы делаете потребность обработать разделители пространства во входе, тогда можно добавить их как часть символьного списка [, ] для входной замены подстроки:

while read line; do 
  sorted=$(sort -g -- <<< "${line//[, ]/ 

(отмечают, что вывод остается строго разграниченным запятой хотя).

\n'}") printf -- "${sorted//

(отмечают, что вывод остается строго разграниченным запятой хотя).

\n'/,}\n" done < file

(отмечают, что вывод остается строго разграниченным запятой хотя).

\n'}") printf -- "${sorted//

, Если Вы делаете потребность обработать разделители пространства во входе, тогда можно добавить их как часть символьного списка [, ] для входной замены подстроки:

while read line; do 
  sorted=$(sort -g -- <<< "${line//[, ]/ 

(отмечают, что вывод остается строго разграниченным запятой хотя).

\n'}") printf -- "${sorted//

(отмечают, что вывод остается строго разграниченным запятой хотя).

\n'/,}\n" done < file

(отмечают, что вывод остается строго разграниченным запятой хотя).

\n'/,}\n" done < file

, Если Вы делаете потребность обработать разделители пространства во входе, тогда можно добавить их как часть символьного списка [, ] для входной замены подстроки:

while read line; do 
  sorted=$(sort -g -- <<< "${line//[, ]/ 

(отмечают, что вывод остается строго разграниченным запятой хотя).

\n'}") printf -- "${sorted//

(отмечают, что вывод остается строго разграниченным запятой хотя).

\n'/,}\n" done < file

(отмечают, что вывод остается строго разграниченным запятой хотя).

0
ответ дан 13 April 2017 в 15:24

Здесь прибывает awk решение,

while read -r line; do (echo $line | awk '{ n=split($1,a,","); asort(a); for(i=0;i<=n;i++) { print a[i];}}') | xargs | sed -e 's/ /,/g'; done < text.txt

Объяснение:

  • awk '{ n=split($1,a,","); asort(a); for(i=0;i<=n;i++) { print a[i];}}'

    Разделения awk поле 1 согласно разделителю , и сохраните каждое значение в массив a наконец ключевая позиция хранится в переменную n.Далее asort(a) функциональный вид вниз значения массива. Затем для цикла в команде awk печатает отсортированные значения в формате записи записью.

  • xargs | sed -e 's/ /,/g'

    xargs объединения все строки в одну строку.

  • sed -e 's/ /,/g'

    Это заменяет пробелы запятыми ,

  • while read -r line;

    Все вышеупомянутое awk,xargs,sed функции сделаны линию за линией с помощью while цикл.

4
ответ дан 13 April 2017 в 15:24

python -c "your code here" input.txt

Или, если Ваша программа имеет несколько строк и eval(), является слишком медленным:

python yourprogram.py input.txt

Эта острота работы:

python -c "for l in open('input.txt'):print(','.join(sorted(l.strip().split(','), key=int)))"
0
ответ дан 13 April 2017 в 15:24

Используя TR и sed

, Подобный в духе к , что jkt123 записал :

while read i; do tr , \\n <<< $i | sort -n | tr \\n , | sed 's/,$//'; done

Это выполняет итерации по строкам, и для каждой строки заменяет запятые новыми строками, сортирует получающиеся строки численно, затем возвращает новые строки к запятым. Основная проблема состоит в том, что это закончит целый результат запятой не новая строка, которая обращена этим, длятся sed. Это разделяет последнюю запятую, и также implicitely добавляет новую строку к своему выводу.

Используя массивы удара

Вот другой подход для контакта с этим “join с проблемой commas”:

while read i; do j=( $(tr , \\n <<< $i | sort -n) ); ( IFS=,; echo "${j[*]}"; ); done

Или записанный с обертками строки:

while read i
do
   j=( $(tr , \\n <<< $i | sort -n) )
   ( IFS=,; echo "${j[*]}"; )
done

Это использует массив удара для хранения результата отсортированной строки и использует способ, которым удар разворачивает массивы в строковые литералы с помощью IFS специальная переменная.

0
ответ дан 13 April 2017 в 15:24

<Забастовка>, самая короткая решение с помощью остроты жемчуга:

perl -ne 'print join(",", sort { $a <=> $b } split(/,|\n/))."\n"' text.txt
0
ответ дан 13 April 2017 в 15:24

Можно сделать этот легко жемчуг использования

полагайте, что у Вас есть файл text.txt

cat text.txt

1,5,7,8,3,6
10,34,67,1,2,0,5

Теперь следующий код жемчуга отсортирует строки в text.txt

 perl -i -e 'while(<>){chomp; my @sorted = sort { $a <=> $b } split(",", $_); print join (",", @sorted); print "\n"}' text.txt

После сортировки

cat text.txt

1,3,5,6,7,8
0,1,2,5,10,34,67
2
ответ дан 13 April 2017 в 15:24

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

cat test | while read line; do echo $(echo $line | datamash -t',' transpose |sort -g| datamash -t',' transpose); done
1
ответ дан 13 April 2017 в 15:24
  • 1
    Не уверенный, почему у Вас создается такое впечатление. Это не было значение по умолчанию в течение нескольких лет, хотя я не уверен точно, когда это было изменено (, кажется, 2008 ). Люди раньше жаловались много на дисковые проверки при начальной загрузке, и таким образом, это было изменено. Очевидно, пользователи могут настроить вещи, должны они хотеть. – mikewhatever 4 October 2015 в 09:37

Другие вопросы по тегам:

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