regex - 根据列值连接两个文件。原始文件有重复值

标签 regex bash join awk sed

我的两个文件如下所示:

文件 1:

18 1600000 + CAA 0 1
18 1600000 - CAC 0 11
18 1600000 - CAC 0 3
18 1600000 - CAC 0 5
18 1600001 - CAA 0 11
18 1600001 + CCC 0 1
18 1600001 - CCC 0 3
18 1600002 - CAT 0 1
18 1600002 - CAT 0 3

文件 2:

18 1600000 + CGG 6 6
18 1600000 - CGT 0 2
18 1600001 - CCC 0 3
18 1600001 + CGG 0 11
18 1600001 - CGG 9 9
18 1600002 - CAT 0 1
18 1600002 - CAT 0 3
18 1600002 + CAT 0 6
18 1600002 + CCA 0 5

我想根据第 2 列加入这两个文件,但在没有匹配项的地方放置一个 NULL 值。在文件 1 中有 4 行 1600000,而在文件 2 中只有 2 行。所以我希望输出如下所示:

18 1600000 + CAA 0 1    1600000 + CGG 6 6
18 1600000 - CAC 0 11   1600000 - CGT 0 2
18 1600000 - CAC 0 3
18 1600000 - CAC 0 5
18 1600001 - CAA 0 11   1600001 - CCC 0 3
18 1600001 + CCC 0 1    1600001 + CGG 0 11
18 1600001 - CCC 0 3    1600001 - CGG 9 9
18 1600002 - CAT 0 1    1600002 - CAT 0 3
18 1600002 - CAT 0 3    1600002 + CAT 0 6
                        1600002 + CCA 0 5
....

我认为 join 命令可能是个问题,因为它只使用 1 个文件作为模板。因此,如果文件 2 中有额外的值,我认为这些值将会丢失。因此,更复杂的 awk 参数可能效果更好。每个文件都有一些其他文件没有的行。

最佳答案

您可以像这样使用 awk:

awk 'NR==FNR{sub(/^[^[:blank:]]+[[:blank:]]+/, ""); a[$1,++c[$1]]=$0; next} 
     {print $0, a[$2,++d[$2]]}' OFS='\t' file2 file1

输出:

18 1600000 + CAA 0 1    1600000 + CGG 6 6
18 1600000 - CAC 0 11   1600000 - CGT 0 2
18 1600000 - CAC 0 3
18 1600000 - CAC 0 5
18 1600001 - CAA 0 11   1600001 - CCC 0 3
18 1600001 + CCC 0 1    1600001 + CGG 0 11
18 1600001 - CCC 0 3    1600001 - CGG 9 9
18 1600002 - CAT 0 1    1600002 - CAT 0 1
18 1600002 - CAT 0 3    1600002 - CAT 0 3

此 awk 命令使用一个关联数组,其中复合键作为第 2 列 + 每个第 2 列值的递增计数器sub 函数用于从第二个文件中丢弃第一列的值,因为输出中不需要。

关于regex - 根据列值连接两个文件。原始文件有重复值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35415113/

相关文章:

用于匹配 Windows 和 Posix 系统的日期时间的 C++ 正则表达式模式

java - 将由特定单词分隔的句子分组

javascript - 需要一个正则表达式来确保数字以 01 02 或 08 开头并且长度为 10 或 11 位

MySQL加入一张表

python - 替换 () 和正则表达式无法更新空白单元格

linux - 格式化和过滤文件到 Csv 表

regex - SED 删除带有 REGEX 模式的行

linux - Bash/Shell-将所有文件从子目录 move 到目标目录?

mysql - 连接sql语句

mysql - 如何在 MySQL 中通过 REGEX 匹配连接两个表?