我有一个看起来像这样的文件,用空格分隔:
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替换它们。如果这个想法看起来不对,我不介意完全不同的解决方案。
答案 0 :(得分:0)
while read line; do echo $line | grep -o "^\([^ ]* *\)\{3\}"| grep -f- file1; done < rex.txt
[^ ]* *
-o
)查看第一个(^
)三个(\{3\}
)列-f-
PS:感谢您教我read
事。