基于来自不同文件的多个列重新排序文件

时间:2017-05-02 02:33:03

标签: regex sorting awk sed grep

我有一个看起来像这样的文件,用空格分隔:

10  1330544 1330555 12.5    2.5 10  0
10  1545844 1545855 6.97674418604651    0   2.32558139534884    4.65116279069767
10  2960444 2960455 14.2857142857143    0   14.2857142857143    0
10  3882344 3882355 14.5038167938931    2.29007633587786    8.3969465648855 3.81679389312977
10  5157844 5157855 10.6666666666667    2.66666666666667    4   4

然而,这不是我想要的订单。订单由看起来像这样的不同文件确定,由制表符分隔:

17  32972444    32972455    12  0.431   0.31    0.559   0.187   0.591   2.286   0.37    0.426   0.546   1.855   0.846   1.936
9   104333344   104333355   12  0.677   0.51    0.316   1.263   0.735   1.087   1.091   0.739   3.92    4.09    NA  NA
20  31921144    31921155    12  0.155   0.632   0.361   0.466   0.625   0.607   3.091   0.721   1.622   0.127   0.537   1.182
4   8370144 8370155 12  0.525   1.094   1.116   0.63    1.753   0.428   1.346   0.857   0.492   0.843   0.946   1.044
9   21324944    21324955    12  1.493   1.505   0.864   0.64    0.777   0.494   1.173   1.666   2.243   1.377   1.194   1.43

这两个文件可以通过前三列进行匹配,并且两个文件包含相同数量的行 - 第二个文件中前三列的每个元组都可以作为第一列中前三列的元组找到文件,反之亦然。

当我手动搜索第二行文件的第一行“17 32972444 32972455”时,我发现第355行命中:

17  32972444    32972455    15.7894736842105    0   5.26315789473684    10.5263157894737

当我搜索第二行“9 104333344 104333355”时,我在第一个文件中找到第1196行:

9   104333344   104333355   9.21052631578947    1.31578947368421    5.26315789473684    2.63157894736842

因此,我正在考虑使用grep,例如:

while read line; do 
echo $line; tosearch=`echo $line | sed 's/ /\t/g'`; 
echo ${tosearch}; grep -P ${tosearch} file1; 
done <file2.columns1-3

这不起作用,因为我既不知道如何使用制表符grep字符串也不知道如何用sed替换它们。如果这个想法看起来不对,我不介意完全不同的解决方案。

1 个答案:

答案 0 :(得分:0)

while read line; do echo $line | grep -o  "^\([^ ]* *\)\{3\}"| grep -f- file1; done < rex.txt
  • rext.txt是定义订单的文件,
    grep magic忽略前三列后的所有内容,不需要sed magic
  • 阅读以空格替换制表符
  • 列不是空格,后面是空格[^ ]* *
  • 仅使用第一个grep(-o)查看第一个(^)三个(\{3\})列
  • 使用第二个grep来查找通过stdin -f-
  • 输入的内容

PS:感谢您教我read事。