在CSV中查找只出现一次的值

在CSV中查找只出现一次的值,csv,awk,Csv,Awk,我有一个csv文件,里面有数千行。我希望能够找到在此文件中只出现一次的值 比如说 dog dog cat dog bird 作为我的结果,我想得到: cat bird 我尝试使用以下awk命令,但它返回了文件中的每个值之一: awk -F"," '{print $1}' test.csv|sort|uniq 返回: dog cat bird 谢谢你的帮助 关闭。尝试: awk-F“,“{print$1}”test.csv | sort | uniq-c | awk'{if($1==1)p

我有一个csv文件,里面有数千行。我希望能够找到在此文件中只出现一次的值

比如说

dog
dog
cat
dog
bird
作为我的结果,我想得到:

cat
bird
我尝试使用以下
awk
命令,但它返回了文件中的每个值之一:

awk -F"," '{print $1}' test.csv|sort|uniq
返回:

dog
cat
bird
谢谢你的帮助

关闭。尝试:

awk-F“,“{print$1}”test.csv | sort | uniq-c | awk'{if($1==1)print$2}”

uniq上的
-c
标志将为您提供计数。下一个awk将查找计数为1的任何项目(第一个字段),并打印第二个字段的值($2)

唯一要注意的是,这将返回鸟之前的猫,因为它之前被重新启动。您可以再次通过管道连接到
sort-r
,以反转排序方向。这与您要求的预期答案相同,但它不是原始排序顺序

关闭。尝试:

awk-F“,“{print$1}”test.csv | sort | uniq-c | awk'{if($1==1)print$2}”

uniq上的
-c
标志将为您提供计数。下一个awk将查找计数为1的任何项目(第一个字段),并打印第二个字段的值($2)

唯一要注意的是,这将返回鸟之前的猫,因为它之前被重新启动。您可以再次通过管道连接到
sort-r
,以反转排序方向。这与您要求的预期答案相同,但它不是原始排序顺序

仅使用awk:

awk -F, '{count[$1]++} END {for (key in count) if (count[key] == 1) print key}' test.csv
就凭awk:

awk -F, '{count[$1]++} END {for (key in count) if (count[key] == 1) print key}' test.csv

剪切到第一个字段,然后排序并仅显示唯一字段:

cut -d ',' -f 1 test.csv | sort | uniq -u

也就是说,如果将
-u
附加到命令中,它就可以工作了。这只是使用
cut
而不是awk。

剪切到第一个字段,然后排序并仅显示唯一字段:

cut -d ',' -f 1 test.csv | sort | uniq -u

也就是说,如果将
-u
附加到命令中,它就可以工作了。这只是使用
cut
而不是awk。

如果Perl是一个选项,那么此代码类似于@glenn jackman的代码:

perl-F,-lane'$c{$F[0]}++;结束{for$k(排序键%c){print$k if$c{$k}==1}}'test.csv

使用以下命令行选项:

  • -n
    围绕输入文件的每一行循环
  • -l
    在处理之前删除换行符,然后将其添加回
  • -a
    自动拆分模式–将输入行拆分为
    @F
    数组。默认为按空格拆分
  • -e
    执行perl代码
  • -F
    自动拆分修改器,在本例中,在
    上拆分,

@F
是每行中的单词数组,索引从
$F[0]

如果Perl是一个选项,此代码类似于@glenn jackman的:

perl-F,-lane'$c{$F[0]}++;结束{for$k(排序键%c){print$k if$c{$k}==1}}'test.csv

使用以下命令行选项:

  • -n
    围绕输入文件的每一行循环
  • -l
    在处理之前删除换行符,然后将其添加回
  • -a
    自动拆分模式–将输入行拆分为
    @F
    数组。默认为按空格拆分
  • -e
    执行perl代码
  • -F
    自动拆分修改器,在本例中,在
    上拆分,

@F
是每行中的单词数组,索引从
$F[0]

开始,唯一需要注意的是:如果第一个逗号分隔的字段包含空格怎么办?那么,管道中的最后一个awk将不会为您提供正确的输出。我会使用sed-rn的//^[]+1[]+//p'yesgood call@glennjackman!我正在处理他的示例输入。
。。。awk'$1==1{print$2}
更为惯用。唯一需要注意的是:如果第一个逗号分隔的字段包含空格怎么办?那么,管道中的最后一个awk将不会为您提供正确的输出。我会使用sed-rn的//^[]+1[]+//p'yesgood call@glennjackman!我正在处理他的示例输入。
。。。awk'$1==1{print$2}
更为惯用。