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