Я смотрел на этот вопрос и задавался вопросом, можно ли сделать следующее из терминала. Я сделал это на python, просто хочу посмотреть, можно ли это сделать с помощью терминала, скриптов bash или чего-то еще.
Предположим, у меня есть файл, который выглядит следующим образом:
2,4,5,14,9
40,3,5,10,1
может ли он быть отсортирован по строкам (строкам)
2,4,5,9,14
1,3,5,10,40
или он слишком сложный? Я сделал это с помощью Python, я просто хочу знать, можно ли это сделать, чтобы в следующий раз я не использовал Python. То, что я сделал, - это создание списков и их сортировка.
Вот другой подход 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
Это должно сделать, о каком Вы ищете. Это считает файл (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
Единственная реальная трудность при выполнении, что Вы хотите использовать сценарии командной строки, состоит в том, что доступное 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
(отмечают, что вывод остается строго разграниченным запятой хотя).
Здесь прибывает 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
цикл.
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)))"
, Подобный в духе к , что 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
специальная переменная.
<Забастовка>, самая короткая забастовка> решение с помощью остроты жемчуга:
perl -ne 'print join(",", sort { $a <=> $b } split(/,|\n/))."\n"' text.txt
Можно сделать этот легко жемчуг использования
полагайте, что у Вас есть файл 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
Мне была нужна эта функциональность также, и решение, которое я нашел, следующим образом (предполагающий, что данные находятся в тестовом файле):
cat test | while read line; do echo $(echo $line | datamash -t',' transpose |sort -g| datamash -t',' transpose); done