我有一维数组
x1 = [1, 2, 3, …, 10]
作为一条记录存储在文件x1.dat
中(全部在一行上),以逗号分隔。 x1.dat
读取
1,2,3,4,5,..., 10
并且有两个数组
array1 = [1,3]
和array2= [4,7]
(array1
和array2
中的元素是数组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
这不起作用。你能帮我纠正一下还是给出更好的选择方法吗?
答案 0 :(得分:2)
您没有提供数据文件的文本格式。我假设它是每行一个元素。
您的代码中存在一些问题。
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