根据 B 列中的值过滤掉 A 列中的行

Filter out rows from column A based on values in column B

我有一个包含两列的 CSV 文件。第一列是所有订阅者的列表,第二列是需要从邮件中排除的订阅者列表:

all,exclusions
alice@example.com,charles@example.com
bill@example.com,alice@example.com
charles@example.com
daisy@example.com
esther@example.com

我需要输出第一列中未列在第二列中的所有订阅者。所需的输出是这样的:

bill@example.com
daisy@example.com
esther@example.com

到目前为止我只有这个:

awk -F, '(NR>1) {if(!=) {print}}' subs.csv

这当然只会过滤掉同一行的两列中都存在匹配值的行。 感谢您的帮助。

用数组。我假设第一列中没有重复项。

awk -F ',' 'NR>1{
              array[]++; array[]--
            }
            END{
              for(i in array){ if(array[i]==1){ print i } }
            }' file

作为一行:

awk -F ',' 'NR>1{ array[]++; array[]-- } END{for(i in array){ if(array[i]==1){ print i } } }' file

输出:

esther@example.com
daisy@example.com
bill@example.com

为了完整性,删除排除的条目,包括重复值。

数据

$ cat file
all,exclusions
alice@example.com,charles@example.com
bill@example.com,alice@example.com
charles@example.com
daisy@example.com
daisy@example.com,alice@example.com
daisy@example.com,charles@example.com
daisy@example.com
esther@example.com
esther@example.com
alice@example.com
$ awk -F ',' 'NR>1 && NF==1{ all[]++ }
  NR>1 && NF==2{ all[]++; excl[]++ }
  END{ for(i in excl){ all[i]=0 };
    for(i in all){ if(all[i]>=1){ print i } } }' file

esther@example.com
daisy@example.com
bill@example.com

有两个数组。第一个字段 </code> 是 <code>list of all subscribers,它用作名为 a 的数组的索引。第二个字段 </code> 是 <code>list of subscribers who need to be excluded,它用作数组 b 的索引。我们在 END 部分以这种方式得到 subscribers from first column who are not listed in the second columnfor (i in a) if (!(i in b)) print i 使用两个数组:

awk -v FS=',' '
        NR > 1 {a[];b[]}
        END{for (i in a) if (!(i in b)) print i}
' file
esther@example.com
daisy@example.com
bill@example.com

或者使用 continue 语句导致下一次迭代开始。

awk -v FS=',' '
        NR > 1 {a[];b[]}
        END{for (i in a) if (i in b) continue;else print i}
' file
esther@example.com
daisy@example.com
bill@example.com