挑选不在一维数组中的元素?

时间:2014-04-28 14:01:48

标签: arrays awk

我有一维数组

x1 = [1, 2, 3, …, 10]

作为一条记录存储在文件x1.dat中(全部在一行上),以逗号分隔。 x1.dat读取

1,2,3,4,5,..., 10

并且有两个数组

array1 = [1,3]array2= [4,7]

array1array2中的元素是数组x1)的一些元素。

我想选择既不在array1中也不在array2中的所有元素。 所需的输出将为

2,5,6,8,9,10

我试过用awk:

$awk 'BEGIN{array1 = (1,3); array2 = (4,7)} {for (i=1; i<=NF;i++) if ((!($i in a1)) && (!($i in a2))) {print $i }}' x1.dat

这不起作用。你能帮我纠正一下还是给出更好的选择方法吗?

1 个答案:

答案 0 :(得分:2)

您没有提供数据文件的文本格式。我假设它是每行一个元素。

您的代码中存在一些问题。

  • 变量赋值,你不能像这样分配一个awk数组。
  • in用法是检查数组(实际哈希表)键,而不是值。

如果你将array1和2放在文件中,或输入字符串,而不是代码中,那会更容易,但我会保留它以显示如何完全按照你所描述的方式解决问题

更好的阅读版本:

awk -v arr1="<yourArray1Str>" -v arr2="<yourArray2Str>" 
    'BEGIN{
        split(arr1,a,",");
        split(arr2,b,",");
        for(x in a)k[a[x]]=1;
        for(x in b)k[b[x]]=1}
    !k[$0]' file

以你的例子:

kent$  cat f
1
2
3
4
5

kent$  awk -v arr1="2,4,3" -v arr2="1,3,4" 'BEGIN{split(arr1,a,",");split(arr2,b,",");for(x in a)k[a[x]]=1;for(x in b)k[b[x]]=1}!k[$0]' f                                   
5