Bash 将文件转换为小写并排序

Bash convert file to lowercase and sort

我正在尝试编写一个脚本来接收 inputFile,将其转换为小写,对其进行排序,然后将结果存储回原始文件中。我是 bash 的新手,所以这是我到目前为止提出的解决方案:

awk '{ print tolower([=11=]) }' $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,因此排序后的 table 仍然包含大写字母。我试图将 awk 的输出重定向到 > inputFile,但这也不起作用。

样本inputFile

TABLE.thisisaTABLE
taBLe.hellO
HELLO.table
hi.table

期望的输出(回到原来的inputFile):

hello.table
hi.table
table.hello
table.thisisatable

您可以使用排序的 -o 标志来执行排序和重定向回原始文件:

awk '{ print tolower([=10=]) }' $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