在Bash中按字母顺序对配对进行排序。

6

我有一个文件,其中包含以下数据:

adam
humanities

castiel
sciences

antwon
sciences

dmitri
informatics

zoe
mathematics

bernard
economics

我想能够根据人名对文件进行排序,以便输出看起来像这样:
adam
humanities

antwon
sciences

bernard
economics

castiel
sciences

dmitri
informatics

zoe
mathematics

cat filename | sort 可以对所有数据进行排序,包括主题。但是如何按人名排序呢?

5个回答

6

使用asortiawk中对数据数组进行排序

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"}'

请注意,asorti 是 gawk(GNU awk)的一部分。因此,它可能不适用于所有系统。+1 - P.P
最终我使用了外部排序,因为这需要在多台服务器上运行,而我真的不确定所有服务器上是否都有gawk。谢谢,Jotne! - rahuL

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
使用 awk - 去除空行并以冒号分隔打印每个记录。然后进行排序,最后使用 awk 以所需格式打印记录。
awk -v RS="" -F"\n" '{print $1 ":" $2}' e | sort | awk -v FS=":" '{print $1 "\n" $2 "\n"}'

1
对于awk,加上-F'\n'选项应该允许在名称和主题字段中包含空格。 - svante

1
这可能适用于您(GNU sed):
sed '/./!d;$!N;s/\n/ /' file | sort | sed 's/ /\n/g;$!G'

删除空白行。读取两行到模式空间。将换行符替换为空格。对文件进行排序。然后再替换换行符并添加空白行。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接