shell不排序去重

一条命令搞定:


awk '!a[$0]++' file



如果是第一次出现a[$0]++的值为0(假),而!a[$0]++的值就为1(真),之后就执行print $0

第二次或者两次以上的出现a[$0]++的值就为大于0的整数值(真),例如1,2,3...,而!a[$0]++的值就为0(假),之后就不执行print $0操作



awk '!($0 in a){a[$0];print $0}'

pattern为!($0 in a),Action为{a[$0];print $0}


分析:

1.执行第一行时的a的数组为空,($0 in a)为假,!($0 in a)为真。执行Action,a[$0]就存在了a[row1],打印第一行

2.执行第二行时的a的数组为a[row1],如果a[row2] 是a[$0]中的元素,!($0 in a)为真为假,不执行Ation。如果a[row2]不是a[$0]中的元素,执行Action,a[$0]中增加元素(a[row1],a[row2]),打印第二行。

3.重复执行类似的第二步骤。达到的去重的效果。

<think>根据用户需求,用户需要实现“排序”的shell指令。结合引用[1]中提到的sort命令和引用[3]中提到的方法,我们可以采用以下方案: 1. **排序**:使用`sort`命令对文件内容进行排序。 2. ****:使用`uniq`命令或`sort -u`选项复行。 具体指令如下: - **方法一**:先排序 ```shell sort file.txt | uniq ``` - **方法二**:使用sort的`-u`选项(直接排序) ```shell sort -u file.txt ``` 其中: - `sort file.txt` 将文件内容排序(默认按字典序升序) - `uniq` 命令只能除**相邻**的复行,因此必须先排序 - `sort -u` 是更简洁的方式,效果等同于`sort | uniq` **注意事项**: 1. 如果文件中有数字,需要按数值排序,可加`-n`选项(如引用[1]中的`-k3,3n`是按第三字段数值排序) 2. 时默认区分大小写,若需忽略大小写可加`-f`(uniq)或`-i`(sort) 例如,对包含版本号的文件排序(如引用[1]中的例子): ```shell sort -t"." -k1,1 -k2,2n -k3,3n -u versions.txt ``` 这里: - `-t"."` 指定分隔符为点 - `-k1,1 -k2,2n -k3,3n` 分别指定第一字段按字母、第二三字段按数值排序 - `-u` --- ### 相关问题 1. 如何对CSV文件按指定列排序? 2. Shell命令`uniq`还有哪些常用选项? 3. 如果要排序,该如何实现?(参考引用[3]的方法) </think>### Shell排序指令详解 实现排序功能的核心命令是 `sort -u`,这是最简洁高效的方式: ```shell sort -u filename.txt ``` #### 工作原理: 1. `sort` 命令对文件内容排序(默认字典序) 2. `-u` 选项(unique)自动,保留唯一值 3. 输出结果:**排序后的唯一值列表** #### 进阶用法: 1. **数值排序**(适合版本号/数字): ```shell sort -t"." -k3,3n -u filename.txt # 按"."分割后第三列数值排序 ``` *适用于引用[1]中的版本号场景* 2. **多字段排序**: ```shell sort -t"," -k2,2n -k1,1r -u data.csv # 先按第二列数值升序,再按第一列字典降序 ``` 3. **处理大文件**(参考引用[2]): ```shell split -l 100000 largefile.txt part_ # 分割文件 for f in part_*; do sort -u $f > $f.uniq; done cat *.uniq | sort -u > final_result.txt ``` #### 特殊场景解决方案: 1. **内存足时**(使用管道分批处理): ```shell cat bigfile.txt | awk '!seen[$0]++' | sort > result.txt ``` 2. **区分大小写**: ```shell sort -f -u filename.txt # -f(fold)忽略大小写 ``` 3. **仅检查复项**: ```shell sort filename.txt | uniq -d # -d 只输出复行 ``` > 关键区别:`uniq` 命令**要求输入已排序**(需配合 sort 使用),而 `sort -u` 直接完成两步操作。引用[3]中的数组方法虽可行,但效率低于标准命令组合[^1][^2][^3]。 --- ### 相关问题 1. 如何统计复项的出现次数? 2. 如果要但保留原始顺序(排序)该如何实现? 3. 如何处理带特殊字符(如空格、引号)的文件名进行排序? 4. 超大型文件(100GB+)排序的优化方案有哪些?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值