【发布时间】:2012-10-11 06:02:08
【问题描述】:
我有两个文件正在尝试加入/合并,基于列 1 和 2。它们看起来像这样,file1(58210 行)比file2(815530 行)短得多,我想根据字段1 和@ 找到这两个文件的交集987654328@作为索引:
file1:
2L 25753 33158
2L 28813 33158
2L 31003 33158
2L 31077 33161
2L 31279 33161
3L 32124 45339
3L 33256 45339
...
file2:
2L 20242 0.5 0.307692307692308
2L 22141 0.32258064516129 0.692307692307692
2L 24439 0.413793103448276 0.625
2L 24710 0.371428571428571 0.631578947368421
2L 25753 0.967741935483871 0.869565217391304
2L 28813 0.181818181818182 0.692307692307692
2L 31003 0.36 0.666666666666667
2L 31077 0.611111111111111 0.931034482758621
2L 31279 0.75 1
3L 32124 0.558823529411765 0.857142857142857
3L 33256 0.769230769230769 0.90625
...
我一直在使用以下几个命令,但最终得到的行数不同:
awk 'FNR==NR{a[$1$2]=$3;next} {if($1$2 in a) print}' file1 file2 | wc -l
awk 'FNR==NR{a[$1$2]=$3;next} {if($1$2 in a) print}' file2 file1 | wc -l
我不确定为什么会发生这种情况,我已经尝试在比较之前进行排序,以防我在两个文件中都有重复的行(基于列 1 和 2),但它没有似乎没有帮助。 (任何关于为什么会这样的见解也值得赞赏)
我怎样才能合并文件,以便只打印在file1 中具有对应列1 和2 的file2 行,并添加file1 的列3,看起来像这样:
2L 25753 0.967741935483871 0.869565217391304 33158
2L 28813 0.181818181818182 0.692307692307692 33158
2L 31003 0.36 0.666666666666667 33158
2L 31077 0.611111111111111 0.931034482758621 33161
2L 31279 0.75 1 33161
3L 32124 0.558823529411765 0.857142857142857 45339
3L 33256 0.769230769230769 0.90625 45339
【问题讨论】:
-
你能举一些第一列不同的例子吗?
-
应该使用哪些字段来连接行?
-
还是应该逐行加入?
-
您的样本数据没有应该匹配的行...
-
您必须有一个在 DOS 上创建的文件和一个在 UNIX 上创建的文件或其他文件,因为在一个或两个文件的行尾必须有某种控制字符输出。在两个文件上尝试“cat -v”以查看控制字符,并在两个文件上尝试 dos2unix 来修复它们。