我希望返回 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