awk 根据列的子集确定唯一的行

awk 根据列的子集确定唯一的行

我希望返回 csv 中对于指定的列子集唯一的行。

示例数据:

Col1,Col2,Col3,Col4
A,10,50,2017
A,10,05,2017
B,20,30,2017
B,20,03,2017
C,30,100,2017
C,30,111,2017
C,30,100,2016
C,40,111,2016
C,30,123,2015

此命令输出单个列(本例中为第 1 列)的唯一值:

awk -F , '{ a[$1]++ } END { for (b in a) { print b } }' file

返回

Col1
A
B
C

我想要一个命令来对 2 列或 n 列执行此操作。

使用 2 列(Col1 和 Col3)的唯一行的期望输出:

Col1,Col3
A,50
A,05
B,30
B,03
C,100
C,111
C,123

对于 Col1 和 Col4

Col1,Col4
A,2017
B,2017
C,2017
C,2016
C,2015

对于 3 列 Col1、Col2 和 Col3

Col1,Col2,Col3
A,10,50
A,10,05
B,20,30
B,20,03
C,30,100
C,30,111
C,40,111
C,30,123

答案1

您可以通过组合哈希键中的列值来实现这一点,例如假设您的输入已排序,则此一次性解决方案适用于第 1-3 列:

awk '!h[$1,$2,$3]++ { NF--; print }' FS=, OFS=, data.csv

输出:

Col1,Col2,Col3
A,10,50
A,10,05
B,20,30
B,20,03
C,30,100
C,30,111
C,40,111
C,30,123

对于第 1 列和第 4 列,执行以下操作:

awk '!h[$1,$4]++ { print $1, $4 }' FS=, OFS=, data.csv

输出:

Col1,Col4
A,2017
B,2017
C,2017
C,2016
C,2015

答案2

要打印某一列,比如说第 1 列和第 4 列,只需运行:

awk -F',' '{print $1, $4}' file

这里的命令是要求awk打印以“,”分隔的指定列

您可以更改列号,添加/删除 $NUM 以获得不同的列。

结合sort,您将获得唯一的行:

awk -F',' '{print $1, $4}' file | sort -u

-u标志从输出中删除重复的项目。

答案3

Python

#!/usr/bin/env python

import sys

filename = sys.argv[1]
col_nums = sys.argv[2:]
if not col_nums:
    sys.exit()

rows_unique = []
for row in open(filename).read().splitlines():
    cells = row.split(',')
    # Select cells in row based on given column numbers.
    cells_selected = [cells[int(col_num)] for col_num in col_nums]
    row_selected = ','.join(cells_selected)
    if row_selected not in rows_unique:
        print(row_selected)
        rows_unique += [ row_selected ]

保存为可执行脚本,然后调用(注意列是从零索引的):

$ get_unique_rows_per_column.py file 0 2
Col1,Col3
A,50
A,05
B,30
B,03
C,100
C,111
C,123

相关内容