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.重复执行类似的第二步骤。达到的去重的效果。

Shell脚本中,数组可以通过多种方法实现。以下是几种常见的方法: 1. **使用`sort`和`uniq`命令**: 这种方法适用于已经排序的数组,或者可以先对数组进行排序,然后再。 ```sh # 定义一个数组 array=(apple banana apple orange banana grape) # 将数组转换为字符串,使用空格分隔 array_str=$(printf "%s " "${array[@]}") # 使用sort和uniq进行排序 unique_array=($(echo "$array_str" | tr ' ' '\n' | sort | uniq)) # 输出后的数组 echo "${unique_array[@]}" ``` 2. **使用`awk`命令**: `awk`可以用于处理文本数据,通过遍历数组并记录每个元素的出现次数来。 ```sh # 定义一个数组 array=(apple banana apple orange banana grape) # 使用awk进行 unique_array=($(printf "%s\n" "${array[@]}" | awk '!seen[$0]++')) # 输出后的数组 echo "${unique_array[@]}" ``` 3. **使用Bash关联数组**: Bash 4及以上版本支持关联数组,可以通过关联数组来记录每个元素的出现次数,从而实现。 ```sh # 定义一个数组 array=(apple banana apple orange banana grape) # 声明一个关联数组 declare -A unique # 遍历数组并记录每个元素的出现次数 for item in "${array[@]}"; do unique["$item"]=1 done # 获取后的元素 unique_array=("${!unique[@]}") # 输出后的数组 echo "${unique_array[@]}" ``` 这些方法都可以有效地对Shell数组进行,选择哪种方法取决于具体的需求和环境。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值