如何使用awk忽略csv文件的多列?

问题描述 投票:0回答:1

我有多个 2.5GB csv 文件,我想扫描这些文件以查找可能的 SSN 信息,以便报告。有些列的信息格式类似于 SSN,因此我想跳过这些列并继续对所有其他列进行正则表达式匹配。

根据我的研究,我没有看到任何方法可以提供从处理中排除的列数组。对 awk 来说还是很新,我想要一种简单的方法来提供可以从正则表达式搜索中排除的列名称或数字。我现在用来执行匹配的命令是

awk -F "," '{for(i=1;i<=NF;i++){ if(match($i, /^[0-9]{3}[- ]?[0-9]{2}[- ]?[0-9]{4}$/)){print $1, $i} } }' my_file.csv 
regex csv awk
1个回答
0
投票

我将使用数组的键来存储要考虑的列数,考虑下面的简单示例,令

file.csv
内容为

A,b,C,d,E
f,G,h,I,j

并且我想输出除第三列之外的所有大写字符时结合字段内容的行数,那么我可以这样做

awk 'BEGIN{FS=","}NR==1{split($0,arr);delete arr[3]}{for(i in arr){if($i~/[[:upper:]]/){print NR,$i}}}' file.csv

获取输出

1 A
1 E
2 G
2 I

说明:我告知 GNU

AWK
,字段分隔符是
,
。在第一行中,我使用
split
字符串函数
获取带有键 1,2,3,4,5 的数组(因为我有 5 列),然后使用我不想要的
delete
元素。对于每一行,我都会迭代数组的剩余键,如果给定字段 (
$i
) 确实匹配正则表达式,我会输出行数 (
NR
) 和该字段的内容。 免责声明:此解决方案假设所有行具有相同数量的字段。

(在 GNU Awk 5.1.0 中测试)

© www.soinside.com 2019 - 2024. All rights reserved.