我有多个文件(10+),我想将它们合并/加入到一个输出文件中,例如:
文件1
2000 0.0202094
2001 0.0225532
2002 0.02553
2003 0.0261099
2004 0.0280311
2005 0.028843
文件 2
2000 0.0343179
2001 0.036318
2003 0.039579
2004 0.0412106
2005 0.041264
文件3
2004 0.068689
2005 0.0645474
所有文件都有相同的两列,但长度不等。
期望的输出是:
file1 file2 file3
2000 0.0202094 0.0343179
2001 0.0225532 0.036318
2002 0.02553
2003 0.0261099 0.0395799
2004 0.0280311 0.0412106 0.0686893
2005 0.028843 0.041264 0.0645474
我已尝试以下代码,但是这些值与第一列不一致:
awk '{printf($1); for(i=2;i<=NF;i+=2) printf ("\t%s", $i); printf "\n"}' <(paste file*) > mergedfile.txt
答案1
您可以awk
通过对第一列条目进行分组,一次性运行所有这些文件。该部分map[$1]?(map[$1] FS $2):($2)
是一个三元语句,意味着如果为空,则添加到由 索引的数组映射中$1
,或者如果它非空,则附加到已经存在的值。
awk '{ map[$1] = ($1 in map)?(map[$1] FS $2):($2); }
END { for(i in map) print i, map[i] }' file*
为了使输出比 生成的输出更具可读性awk
,请将输出通过管道传输为
awk '{ map[$1] = ($1 in map)?(map[$1] FS $2):($2); }
END { for(i in map) print i, map[i] }' file* | column -t > mergedfile.txt
答案2
通过下面的脚本完成
STEP1
awk '{print $1}' file1 file2 file3| awk '{if(!seen[$1]++){print $0}}' >pattern_content
STEP2
for i in `awk '{print $1}' file1 file2 file3| sort | uniq`; do grep "$i" file1>/dev/null; if [[ $? == 0 ]]; then grep $i file1| awk '{print $2}'; else echo " "; fi; done > file1_o
for i in `awk '{print $1}' file1 file2 file3| sort | uniq`; do grep "$i" file2>/dev/null; if [[ $? == 0 ]]; then grep $i file2| awk '{print $2}'; else echo " "; fi; done > file2_o
for i in `awk '{print $1}' file1 file2 file3| sort | uniq`; do grep "$i" file3>/dev/null; if [[ $? == 0 ]]; then grep $i file3| awk '{print $2}'; else echo " "; fi; done > file3_o
step3
paste pattern_content file1_o file2_o file3_o|sed '1i file1 file2 file3'| sed "s/file1/\t&/g"
输出
file1 file2 file3
2000 0.0202094 0.0343179
2001 0.0225532 0.036318
2002 0.02553
2003 0.0261099 0.0395799
2004 0.0280311 0.0412106 0.0686893
2005 0.028843 0.041264 0.0645474