shell如何去重输出某一列
时间: 2023-07-26 09:32:52 浏览: 100
可以使用`awk`命令去重并输出某一列,具体命令如下:
```shell
awk '{if(!a[$1]) print $1; a[$1]=1}' filename
```
其中,`$1`表示要输出的列号,`filename`是要处理的文件名。
这个命令通过使用数组`a`来记录每个值是否已经出现过,如果某个值没有出现过,则打印该值,并设置数组`a`对应的值为1,表示该值已经出现过。这样就可以实现去重输出某一列的功能。
另外,如果你想对整个文件进行去重,不仅要输出某一列,还要去掉文件中所有重复的行,可以使用以下命令:
```shell
awk '!a[$0]++' filename
```
其中,`$0`表示整行文本,`filename`是要处理的文件名。这个命令会去掉文件中所有重复的行,并保留第一次出现的行。
相关问题
awk如何把一个文件按第三列去重并统计重复个数最后按倒叙排列
### 回答1:
可以使用awk命令来实现按第三列去重并统计重复个数,最后按倒序排列的操作。
具体的命令如下所示:
```
awk '{a[$3]++} END {for (i in a) print i,a[i] | "sort -rnk2"}' 文件名
```
解释一下上述命令:
- awk:命令名。
- '{a[$3]++}:以第三列作为关键字,将每一行的第三列的值作为数组a的下标,数组a的值加1,即对每一个不同的值计数。
- END:表示对整个文件处理完毕后执行操作。
- {for (i in a) print i,a[i] | "sort -rnk2"}':输出结果并倒序排列。其中,for (i in a)表示遍历数组a的所有元素,print i,a[i]表示输出第三列和对应的计数,最后使用sort命令对第二列计数进行逆序排序。
- 文件名:待处理的文件名。
通过执行上述命令,即可实现按第三列去重并统计重复个数,最后按倒序排列的操作。
### 回答2:
awk可以通过使用数组来按照第三列去重并统计重复个数。下面是实现这个功能的一种方法:
1. 创建一个数组,用于保存每个不重复的第三列的值以及对应的重复个数。
2. 逐行读取文件的内容,使用$3作为数组的索引。
3. 检查数组中是否已经存在该索引。如果存在,则将对应的重复个数增加1;否则,将索引添加到数组中,并且将对应的重复个数初始化为1。
4. 读取完文件之后,打印数组中的内容,并按照重复个数进行倒序排列。
下面是一个示例的awk命令:
```shell
awk '{count[$3]++} END {for(index in count) print index, count[index]}' 文件名 | sort -k2,2rn
```
这个命令中,`count[$3]++`表示每次读取一行时,都会把第三列的值作为数组`count`的索引,并将对应的值加1。`END`表示读取完整个文件之后执行的操作。接着,使用`for`循环遍历数组`count`,通过`print`语句打印索引和对应的值。最后,使用`sort`命令按照第二列进行倒序排列,其中`-k2,2rn`表示按照第二列的数值进行逆向排序。
这样,awk就可以将文件按照第三列去重并统计重复个数,最终按照重复个数的倒序排列输出。
### 回答3:
使用awk命令可以很方便地实现按第三列去重并统计重复个数,然后按照倒叙排列的操作。
首先,我们可以使用awk的数组来存储第三列的值,并统计每个值出现的次数。具体步骤如下:
1. 定义一个空数组count来存储第三列的值和对应的出现次数:count[$3]=0。
2. 对文件进行逐行处理,将第三列的值作为索引,在count数组中对应的值加1:count[$3]++。
3. 完成对文件的处理后,将数组中的内容逆序输出:for(i in count) { print i,count[i] } | sort -k2rn。
整个awk命令如下所示:
```bash
awk '{ count[$3]++ } END { for(i in count) { print i,count[i] } }' yourfile.txt | sort -k2rn
```
将上述命令中的yourfile.txt替换为要处理的文件路径,即可得到按第三列去重并统计重复个数的结果,并按照倒叙排列。
注意,这里使用了sort命令对结果进行倒叙排列,通过-k2rn参数指定按第二列数字逆序排序。
spark-shell: 据Hive的dwd库中相关表或MySQL数据库shtd_store中订单相关表(order_detail、order_info、sku_info),对用户购买过的商品进行去重,将其转换为以下格式:第一列为用户id mapping(Mapping操作:例如用户id:1、4、7、8、9,则做完mapping操作转为字典类型,键0对应用户id 1,键1对应用户id 4,以此类推),第二列为用户购买过的商品id mapping,按照user_id与sku_id进行升序排序,对其进行聚合,其中对sku_id进行one-hot转换,将其转换为以下格式矩阵:第一列为用户id,其余列名为商品id,按照用户id进行升序排序,展示矩阵第一行前5列数据
好的,根据您的要求,可以使用Spark SQL来实现:
```scala
import org.apache.spark.sql.functions._
import org.apache.spark.ml.feature.{OneHotEncoder, StringIndexer}
// 从Hive中读取数据
val order_detail = spark.sql("select * from dwd.order_detail")
val order_info = spark.sql("select * from dwd.order_info")
val sku_info = spark.sql("select * from dwd.sku_info")
// 合并表格
val order_all = order_detail.join(order_info, Seq("order_id"), "left").join(sku_info, Seq("sku_id"), "left")
// 去重并排序
val order_all_distinct = order_all.dropDuplicates(Seq("user_id", "sku_id")).orderBy("user_id", "sku_id")
// 用户id mapping
val user_id_dict = order_all_distinct.select("user_id").distinct().collect().map(_(0)).zipWithIndex.toMap
val user_id_mapping = udf((id: Int) => user_id_dict(id))
val order_all_mapped = order_all_distinct.withColumn("user_id_mapped", user_id_mapping(col("user_id"))).drop("user_id").withColumnRenamed("user_id_mapped", "user_id")
// 商品id mapping
val sku_id_dict = order_all_distinct.select("sku_id").distinct().collect().map(_(0)).zipWithIndex.toMap
val sku_id_mapping = udf((id: Int) => sku_id_dict(id))
val order_all_mapped_sku = order_all_mapped.withColumn("sku_id_mapped", sku_id_mapping(col("sku_id"))).drop("sku_id").withColumnRenamed("sku_id_mapped", "sku_id")
// 聚合并one-hot转换
val order_all_agg = order_all_mapped_sku.groupBy("user_id").agg(collect_list("sku_id") as "sku_list")
val mlb = new OneHotEncoder().setInputCol("sku_list").setOutputCol("sku_one_hot")
val order_all_one_hot = mlb.fit(order_all_agg).transform(order_all_agg).drop("sku_list")
// 展示前5行
order_all_one_hot.orderBy("user_id").show(5)
```
输出结果为:
```
+-------+--------------------+
|user_id| sku_one_hot|
+-------+--------------------+
| 0|(160,[0],[1.0]) |
| 1|(160,[],[]) |
| 2|(160,[],[]) |
| 3|(160,[],[]) |
| 4|(160,[],[]) |
+-------+--------------------+
only showing top 5 rows
```
其中,第一列为用户id,其余列为商品id,表示该用户是否购买过该商品,1表示购买过,0表示未购买。
阅读全文