唯一行值跳过 csv 中的标题

唯一行值跳过 csv 中的标题

我正在尝试查找列中的所有唯一值。但是,通过此命令,我还将获得标题行。我该如何跳过它?

awk -vFPAT='([^,]*)|("[^"]+")|","' '{if ($2!~/NULL/) {print $2}}' Files/* | sort | uniq -c | sort -n | wc -l

样本数据如下:

"link","shared_story","101","52
"link","published_story","118","100
"link","published_story","134","51
"link",NULL,"152","398
"link","shared_story","398","110

答案1

awk 中当前文件的行号存储在特殊FNR变量中(NR保存总体行号,而不是每个文件的行号)。因此,如果您的标题位于第一行,您只需修改命令即可跳过该行:

awk -vFPAT='([^,]*)|("[^"]+")|","' '{if ($2!~/NULL/ && FNR>1) {print $2}}' Files/* 

或者,您可以跳过标题中与特定字符串匹配的行:

awk -vFPAT='([^,]*)|("[^"]+")|","' '{if ($2!~/NULL/ && !/headerString/) {print $2}}' Files/*

答案2

您可以使用一个 awk 命令来完成整个任务,如下所示:

awk -vFPAT='([^,]*)|("[^"]+")|","' 'FNR > 1 && $2 !~ /NULL/ && !seen[$2]++ {cnt++}
                                    END {print cnt}' *.csv

这里关于这个习语的一个例子awk,它用于仅在我们第一次看到它时才考虑哈希中的值。因此它对于各种任务很有用,例如排除重复项、排除唯一项、仅允许出现 N 次等。

另请参阅标准示例awk 内置变量, FNR 是每个文件的记录数(对于一个输入文件,FNR==NR每一行)


另外,一般来说,如果您想使用任何命令解析除第一行之外的所有文件,您可以使用tail.这会排除每个文件的第一行并打印其余部分:

tail -n +2 *.csv | command

相关内容