2015-09-07 2 views
1

У меня есть требование, когда мне нужно получить первые четыре символа из каждой строки файла и отсортировать их.Получить первые N символов и отсортировать их

Я пробовал внизу. но его не сортировать каждую строку

cut -c1-4 simple_file.txt | sort -n 

O/P с помощью описанного выше:

appl 
bana 
uoia 

Ожидаемого результат:

alpp 
aabn 
aiou 
+3

Что находится в файле simple_file.txt? –

ответ

2

Попробуйте определения два вспомогательных функций:

explodeword() { 
     test -z "$1" && return 
     echo ${1:0:1} 
     explodeword ${1:1} 
} 

sortword() { 
     echo $(explodeword $1 | sort) | tr -d ' ' 
} 

Тогда

cut -c1-4 simple_file.txt | while read -r word; do sortword $word; done 

будет делать то, что вы хотите.

3

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

Я знаю, что вы не помечать вопрос с , но вот один из способов вы можете сделать это:

perl -F'' -lane 'print(join "", sort @F[0..3])' file 

Это использует переключатель -a для автоматического разделения каждой строки ввода на разделитель, указанный -F (в этом случае пустая строка, поэтому каждый символ является ее собственным элементом в массиве @F). Затем он сортирует первые 4 символа массива, используя стандартный порядок сравнения строк. Результат объединяется в пустую строку.

+1

Еще один perl-путь, но аналогичный 'perl -lpe '$ _ = join" ", sort split //, substr ($ _, 0,4)'' – 123

1

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

Я бы это сделал в Python, но так как вы может не иметь Python, вот короткая команда awk, которая делает то, что вы хотите.

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

Просто введите имя файла (или файлов), который вы хотите обработать в конце командной строки.

Вот некоторые данные, которые я использовал, чтобы проверить команду: Данные

this 
is a 
simple 
test file 

a 
of 
apple 
banana 
cat 
uoiea 
bye 

А вот выходного

hist 
ais 
imps 
estt 

a 
fo 
alpp 
aabn 
act 
eiou 
bey 

Вот некрасиво Python один лайнер; это будет выглядеть немного лучше в качестве надлежащего сценария, а не как команда Bash строки:

python -c "import sys;print('\n'.join([''.join(sorted(s[:4])) for s in open(sys.argv[1]).read().splitlines()]))" 

В отличие от версии AWK, эта команда может обрабатывать только один файл, и он читает весь файл в ОЗУ обрабатывать его, а не обрабатывать его по очереди.

+1

Я подумывал о том, чтобы спуститься по этому маршруту - стоит упомянуть то, что ' asort' является функцией GNU awk. –

+1

@TomFenech: Ну, так оно и есть. Надеюсь, Bubbles находится в системе GNU. :) FWIW, 'perl' выглядит так, что это победитель этой задачи, с точки зрения лаконичности и элегантности. Ваш код, конечно, меньше, чем все, что я могу придумать в Python. –

Смежные вопросы