我有三个文件,每个文件中的信息不会以任何方式重叠 - 但是,它们需要以特定方式相互合并才能有用。
第一个文件在后两个文件中是唯一的,它们以相同的方式设置。 文件1看起来像这样:
rs101 12 126890980 A G
rs102 4 114553253 A C
rs103 9 172776204 C T
文件2如下所示:
1 178 0.12 0.26 0.02
1 1458 0.35 0.37 0.021
1 318 0.99 0.105 0.08
文件3如下所示:
1 3567 0.78 0.67 0.005
0 0 0 0 0
1 3567 0.34 -0.15 0.001
我想要一个脚本将这些文件合并到文件中以生成第三个文件:
rs101 12 126890980 A G
1 178 0.12 0.26 0.02
1 3567 0.78 0.67 0.005
rs102 4 114553253 A C
1 1458 0.35 0.37 0.02
0 0 0 0 0
rs103 9 172776204 C T
1 318 0.99 0.105 0.08
1 3567 0.34 -0.15 0.001
问题是如果这些文件合并不正确,它们在运行分析时将无法提供正确的信息 - 我可以在每个文件的末尾添加一个唯一的列(例如,rs#可以在文件中打印两次一个(一次在第一列,一次在最后一列),然后相应的rs号可以添加到文件2和3末尾的另一列中。然后我可以手动检查合并是否正确发生。任何见解或建议表示赞赏!
答案 0 :(得分:5)
单向,使用paste
:
paste -d "\n" file1.txt file2.txt file3.txt
结果:
rs101 12 126890980 A G
1 178 0.12 0.26 0.02
1 3567 0.78 0.67 0.005
rs102 4 114553253 A C
1 1458 0.35 0.37 0.021
0 0 0 0 0
rs103 9 172776204 C T
1 318 0.99 0.105 0.08
1 3567 0.34 -0.15 0.001
这假定您的每个输入文件包含相同数量的行。要检查每个文件(从而避免潜在的合并问题),请使用wc
:
wc -l file1.txt file2.txt file3.txt
结果:
3 file1.txt
3 file2.txt
3 file3.txt
9 total
HTH
答案 1 :(得分:2)
在命令行上使用Perl:
perl -e '
@fh = map {open my $fh, $_; $fh} @ARGV;
print map <$_>.'', @fh until grep eof, @fh;
' file1.txt file2.txt file3.txt
答案 2 :(得分:1)
使用perl
的一种方式:
perl -e '
open $fh1, q|<|, shift;
open $fh2, q|<|, shift;
open $fh3, q|<|, shift;
while ( $l1 = <$fh1>,
$l2 = <$fh2>,
$l3 = <$fh3> ) {
printf qq|%s|, join qq||, $l1, $l2, $l3;
}
' File1 File2 File3
输出:
rs101 12 126890980 A G
1 178 0.12 0.26 0.02
1 3567 0.78 0.67 0.005
rs102 4 114553253 A C
1 1458 0.35 0.37 0.021
0 0 0 0 0
rs103 9 172776204 C T
1 318 0.99 0.105 0.08
1 3567 0.34 -0.15 0.001
答案 3 :(得分:1)
在shell中使用文件描述符 -
while IFS= read -r lineA && IFS= read -r lineB <&3 && IFS= read -r lineC <&4 ; do
echo "$lineA"; echo "$lineB"; echo "$lineC"
done <file1 3<file2 4<file3