gpt4 book ai didi

regex - 带变量的 AWK 负正则表达式

转载 作者:行者123 更新时间:2023-12-04 00:16:52 27 4
gpt4 key购买 nike

我在 bash 脚本中使用 awk 来比较两个文件以获取不匹配的行。我需要将第二个文件的所有三个字段(作为一个模式?)与第一个文件的所有行进行比较:

第一个文件:

chr1    9997    10330   HumanGM18558_peak_1     150     .       10.78887        18.86368        15.08777        100
chr1 628885 635117 HumanGM18558_peak_2 2509 . 83.77238 255.95094 250.99944 5270
chr1 15966215 15966638 HumanGM18558_peak_3 81 . 7.61567 11.78841 8.17169 200

第二个文件:

chr1 628885 635117
chr1 1250086 1250413
chr1 16613629 16613934
chr1 16644496 16644800
chr1 16895871 16896489
chr1 16905126 16905616

目前的思路是在一个数组中加载一个文件,使用AWK的负正则表达式进行比较。

readarray a < file2.txt
for i in "${a[@]}"; do
awk -v var="$i" '!/var/' file1.narrowPeak | cat > output.narrowPeak
done

问题是 '!/var/' 不能使用变量。

最佳答案

单独使用 awk:

$ awk 'NR==FNR{a[$1,$2,$3]; next} !(($1,$2,$3) in a)' file2 file1
chr1 9997 10330 HumanGM18558_peak_1 150 . 10.78887 18.86368 15.08777 100
chr1 15966215 15966638 HumanGM18558_peak_3 81 . 7.61567 11.78841 8.17169 200
  • NR==FNR 这仅适用于第一个文件,在此示例中为 file2
  • a[$1,$2,$3] 根据前三个字段创建键,如果两个文件之间的间距完全相同,您可以简单地使用 $0 而不是$1,$2,$3
  • next 跳过剩余命令并处理下一行输入
  • ($1,$2,$3) in a 检查 file1 的前三个字段是否作为键出现在数组 a 中。然后反转条件。

这是另一种写法(感谢 Ed Morton)

awk '{key=$1 FS $2 FS $3} NR==FNR{a[key]; next} !(key in a)' file2 file1

关于regex - 带变量的 AWK 负正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63074772/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com