Bash конвертировать файл в нижний регистр и сортировать
Я пытаюсь написать сценарий, который будет принимать inputFile
преобразовать его в нижний регистр, отсортировать и сохранить результаты в исходном файле. Я довольно новичок в bash, так что это решение, которое я придумал до сих пор:
awk '{ print tolower($0) }' $inputFile
index=0
for i in `cat $inputFile`
do
tables[${index}]=$i
index=$(($index + 1))
done
IFS=$'\n' tables=($(sort <<<"${tables[*]}"))
rm -r $inputFile
printf "%s\n" "${tables[@]}" >> $inputFile
Сортировка этого аспекта работает довольно хорошо, но я не могу сохранить результаты awk
к оригиналу inputFile
Таким образом, отсортированная таблица по-прежнему содержит заглавные буквы. Я пытался перенаправить вывод awk
в > inputFile
, но это тоже не сработало.
Образец inputFile
:
TABLE.thisisaTABLE
taBLe.hellO
HELLO.table
hi.table
Желаемый вывод (обратно в оригинал inputFile
):
hello.table
hi.table
table.hello
table.thisisatable
3 ответа
Вы можете использовать -o
флаг сортировки для выполнения сортировки и перенаправления обратно в исходный файл:
awk '{ print tolower($0) }' $inputFile | sort -o $inputFile
Аналогичное решение с sed:
sed 's/.*/\L&/' $inputFile | sort -o $inputFile
Пояснение: s/.*/\L&/
означает конвертировать всю строку (.*
) в нижнем регистре, используя \L
, &
обозначает согласованный образец.
Вы можете использовать Perl:
$ perl -lne 'push @a, lc; END { print join("\n", sort @a) }' $inputFile
hello.table
hi.table
table.hello
table.thisisatable
Работает:
perl -lne # invoke perl with a loop around the lines of the file
push @a, lc; # make line read lower case; push the result
END # block of code executed at the end
{ print join("\n", sort @a) } # Print each sorted line with \n
Если вы хотите изменить файл на месте:
$ perl -i.bak -0777 -lne 'print join("\n", sort map(lc, split /\n/))' file.txt
И если вы не хотите, чтобы резервный файл был сделан:
$ perl -i -0777 -lne 'print join("\n", sort map(lc, split /\n/))' file.txt