我有一个包含以下数据的文件:
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
对包括主题在内的所有数据进行排序。我如何用人名来排序?
答案 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