根据 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 column
:for (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
我有一个包含两列的 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 column
:for (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