合并含空文件的File4按第二字段倒序排序求助
搞定File4按第二字段倒序排序的问题
嘿,我来帮你梳理下问题根源和解决办法~
首先你遇到两个小麻烦:一是File4左侧有多余空格,二是sort -k2,2 -r没按你预期的第二字段倒序,反而只是反转了原有顺序。咱们一步步来解决:
为啥会出问题?
- 左侧空格的由来:因为File2是空文件,
cat File2 File3 > File4其实就是把File3原封不动复制到File4,所以空格肯定是从File3带过来的——也就是你之前用uniq -d File1输出的每行开头就有空格(或者那个$符号加空格)。 - sort命令失效的关键:你的数据是用
#分隔字段的,但sort默认认的是**空白字符(空格、制表符)**当分隔符!所以你写-k2,2的时候,它是把空白分割后的第二个“块”当成字段,而不是#分割后的第二个字段。比如行$ John#Smith#3400#2000.00,空白分割后第一个字段是$,第二个是整个John#Smith#3400#2000.00,这时候sort -k2,2 -r当然只会按这个长字符串反转,根本没用到你想要的Smith/George这些字段。
一步步解决
第一步:清理开头的多余字符(可选但推荐)
如果想去掉每行开头的$和空格,用sed一键搞定:
sed 's/^[ $]*//' File4 > File4_cleaned
这个命令会删掉每行开头所有的空格和$,处理后每行就变成John#Smith#3400#2000.00这种干净的格式。
第二步:按#分隔的第二字段倒序排序
现在给sort指定分隔符为#,让它识别正确的字段:
# 用清理后的文件排序 sort -t '#' -k2,2r File4_cleaned # 不想清理直接处理原File4也可以,命令一样 sort -t '#' -k2,2r File4
参数说明:
-t '#':告诉sort“字段之间用#分隔”-k2,2r:表示按第2个字段(从1开始数)排序,r是倒序的意思
如果要把排序结果保存下来,加个重定向就行:
sort -t '#' -k2,2r File4_cleaned > File4_sorted
看看效果
假设清理后的File4_cleaned内容是:
John#Smith#3400#2000.00 Hidey#George#1000#2000.00 Blue#Light#2300#9000.00 Trasy#Brown#2000#4000.00 Hidey#George#1000#2000.00
执行排序命令后,输出会按第二字段倒序排列(Smith > Light > George > Brown):
John#Smith#3400#2000.00 Blue#Light#2300#9000.00 Hidey#George#1000#2000.00 Hidey#George#1000#2000.00 Trasy#Brown#2000#4000.00
这样就完全符合你的需求啦~
内容的提问来源于stack exchange,提问作者Tasneem
相关产品推荐
相关产品推荐

