在Bash中按字母顺序排序

时间:2013-08-22 07:48:43

标签: bash sorting sed awk

我有一个包含以下数据的文件:

adam
humanities

castiel
sciences

antwon
sciences

dmitri
informatics

zoe
mathematics

bernard
economics

我希望能够对w.r.t文件的名称进行排序,以便输出看起来像这样:

adam
humanities

antwon
sciences

bernard
economics

castiel
sciences

dmitri
informatics

zoe
mathematics

cat filename | sort对包括主题在内的所有数据进行排序。我如何用人名来排序?

5 个答案:

答案 0 :(得分:6)

awk 中使用 asorti 排序数据数组

awk '{a[$1]=$2} END {n=asorti(a,c);for (i=1;i<=n;i++) print c[i] "\n" a[c[i]] "\n"}' RS= file
adam
humanities

antwon
sciences

bernard
economics

castiel
sciences

dmitri
informatics

zoe
mathematics

如果您的 awk 没有 asorti ,请尝试以下操作:

awk '{print $1,$2}' RS="" file | sort | awk '{print $1 "\n" $2 "\n"}'

答案 1 :(得分:2)

这是一个非常残酷的解决方案,但有效...... :)你可以让它看起来更好。 主要想法是创建

<name>|<occupation>\n 

列出并对其进行排序,而不是将其看作原始文件。

cat /tmp/delme | sed -e ':a;N;$!ba;s/\n/|/g' | sed -e 's/||/\n|/g' | sort | sed -e 's/|/\n/g'

答案 2 :(得分:2)

使用awk - 剥去空行并打印以冒号分隔的每条记录。然后排序然后使用awk打印所需格式的记录。

awk -v RS="" -F"\n" '{print $1 ":" $2}' e | sort | awk -v FS=":" '{print $1 "\n" $2 "\n"}'

答案 3 :(得分:1)

这可能适合你(GNU sed):

sed '/./!d;$!N;s/\n/ /' file | sort | sed 's/ /\n/g;$!G'

删除空白行。在模式空间中读取两行。用空格替换换行符。排序文件。替换换行符并添加空行。

答案 4 :(得分:0)

不漂亮,如果你的名字包含空格,它将不起作用......你可能想要一个perl解决方案,以一种理智和可读的方式做到这一点。

$ awk -v RS='\n\n' '{ print $1, $2 }' foo.input | sort | sed -e 's#$#\n#g' -e 's# #\n#g'
adam
humanities

antwon
sciences

bernard
economics

castiel
sciences

dmitri
informatics

zoe
mathematics