Unix连接在Windows 7上产生不一致的结果

杰伊·格雷(Jay Gray)

设置一个数据集,其中一个文件中的最大记录数为〜130,000。

这是第一个文件1.txt的子集:

CID|UID|Key|sis_URL
1|D000108|RDHQFKQIGNGIED|http://sis.gov/regno=0000870779
1|D000108|RDHQFKQIGNGIED|http://sis.gov/regno=0014992622
1|D000644|RDHQFKQIGNGIED|http://sis.gov/regno=0000870779
1|D000644|RDHQFKQIGNGIED|http://sis.gov/regno=0014992622
1|D002331|RDHQFKQIGNGIED|http://sis.gov/regno=0000870779
1|D002331|RDHQFKQIGNGIED|http://sis.gov/regno=0014992622
11|C024565|WSLDOOZREJYCGB|http://sis.gov/regno=0000107062
13|C009947|PBKONEOXTCPAFI|http://sis.gov/regno=0000120821
13|C009947|PBKONEOXTCPAFI|http://sis.gov/regno=0063697187

这是第二个文件2.txt的子集:

CID|bro_URL
11|http://bro.gov/nmbr=0149
13|http://bro.gov/nmbr=0119

我正在Windows 7、64位和8GB内存下运行gnuwin32;因此,需要在Windows中使用双引号。join命令是:

join -t"|" -1 1 -2 1 -a1 -a2 -e "NULL" -o "0,1.2,1.3,1.4,2.2" 1.txt 2.txt > 3_.txt

这是输出文件3.txt。

CID|UID|Key|sis_URL|bro_URL
1|D000108|RDHQFKQIGNGIED|http://sis.gov/regno=0000870779|NULL
1|D000108|RDHQFKQIGNGIED|http://sis.gov/regno=0014992622|NULL
1|D000644|RDHQFKQIGNGIED|http://sis.gov/regno=0000870779|NULL
1|D000644|RDHQFKQIGNGIED|http://sis.gov/regno=0014992622|NULL
1|D002331|RDHQFKQIGNGIED|http://sis.gov/regno=0000870779|NULL
1|D002331|RDHQFKQIGNGIED|http://sis.gov/regno=0014992622|NULL
11|NULL|NULL|NULL|http://bro.gov/nmbr=0149
13|NULL|NULL|NULL|http://bro.gov/nmbr=0119
11|C024565|WSLDOOZREJYCGB|http://sis.gov/regno=0000107062|NULL
13|C009947|PBKONEOXTCPAFI|http://sis.gov/regno=0000120821|NULL
13|C009947|PBKONEOXTCPAFI|http://sis.gov/regno=0063697187|NULL

对于CID:11和CID:13,我期望:

11|C024565|WSLDOOZREJYCGB|http://sis.gov/regno=0000107062|http://bro.gov/nmbr=0149
13|C009947|PBKONEOXTCPAFI|http://sis.gov/regno=0000120821|http://bro.gov/nmbr=0119
13|C009947|PBKONEOXTCPAFI|http://sis.gov/regno=0063697187|http://bro.gov/nmbr=0119

为什么joinon CID:11和CID:13失败?

注意:在发布此问题之前,我运行了上面的子集并产生了正确的结果。运行完整集时,我得到的结果不正确(此处显示了子集)。

知道为什么吗?有什么推荐的替代品吗?

完成此join过程后,我的决赛桌将有15列宽。但是我已经受累于第4列。

是否有任何建议的解决方法,例如awk

HåkonHægland

您可以尝试以下命令:

awk -f a.awk 2.txt 1.txt > 3.txt

在哪里a.awk

BEGIN { FS=OFS="|" }
NR==FNR{
    a[$1]=$2
    next
}
{
    if ($1 in a)
        $(NF+1)=a[$1]
    else 
        $(NF+1)="NULL"
    print
}

输出:

CID|UID|Key|sis_URL|bro_URL
1|D000108|RDHQFKQIGNGIED|http://sis.gov/regno=0000870779
1|D000108|RDHQFKQIGNGIED|http://sis.gov/regno=0014992622
1|D000644|RDHQFKQIGNGIED|http://sis.gov/regno=0000870779
1|D000644|RDHQFKQIGNGIED|http://sis.gov/regno=0014992622
1|D002331|RDHQFKQIGNGIED|http://sis.gov/regno=0000870779
1|D002331|RDHQFKQIGNGIED|http://sis.gov/regno=0014992622
11|C024565|WSLDOOZREJYCGB|http://sis.gov/regno=0000107062|http://bro.gov/nmbr=0149
13|C009947|PBKONEOXTCPAFI|http://sis.gov/regno=0000120821|http://bro.gov/nmbr=0119
13|C009947|PBKONEOXTCPAFI|http://sis.gov/regno=0063697187|http://bro.gov/nmbr=0119

解释

  • 我们将数据读2.txt入关联数组a
  • 该测试NR==FNR用于仅匹配命令行上的第一个文件,即该文件2.txt
  • next语句很重要,因此不执行以下规则2.txt
  • if然后仅对第二条规则(包含测试的一条规则)执行,1.txt但是来自的信息2.txt仍然可以通过数组使用a
  • 如果第一个字段与中的第一列中的字段匹配2.txt,即:if ($1 in a),那么我们将该值插入到行的末尾(NF是从中读取的字段数(即:列)1.txt
  • 如果不匹配,我们插入字符串 "NULL"

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章