按列合并文本文件:两列常用,并追加第三列形成所有文件

时间:2018-03-16 18:01:59

标签: bash shell awk

尝试将整个文件夹的相同格式的文件合并到合并文件中。

head File1.txt
11  116701285   204
11  116701286   209
11  116701287   209
11  116701288   208
11  116701289   209
11  116701290   208
11  116701291   208
11  116701292   210
11  116701293   209
11  116701294   213

head File2.txt
11  116701285   188
11  116701286   192
11  116701287   191
11  116701288   191
11  116701289   191
11  116701291   191
11  116701292   194
11  116701293   194
11  116701294   199

.........

head FileN.txt
11  116701285   190
11  116701286   192
11  116701287   191
11  116701288   189
11  116701289   191
11  116701290   192
11  116701291   193
11  116701292   197
11  116701293   196
11  116701294   199

所需的输出(前两列之后的列数对应于文件数。前两列在所有文件中都相同。文件中没有标题)

11  116701285   188 204 190
11  116701286   192 209 192
11  116701287   191 209 191
11  116701288   191 208 189
11  116701289   191 209 191
11  116701290   191 0   192
11  116701291   191 208 193
11  116701292   194 210 197
11  116701293   194 209 196
11  116701294   199 213 199

如果该条目不存在,请填写0.使用连接但只能执行两个文件。

3 个答案:

答案 0 :(得分:3)

您可以使用此awk

awk '{
   k=$1 OFS $2
}
FNR == NR {
   v[++n] = k
}
{
   a[ARGIND,k] = $3
}
END {
   for(j=1; j<=n; j++) {
      printf "%s", v[j]
      for (i=1; i<ARGC; i++)
         printf "%s", OFS ((i,v[j]) in a ? a[i,v[j]] : 0)
      print ""
   }
}' File*.txt | column -t

11  116701285  204  188  190
11  116701286  209  192  192
11  116701287  209  191  191
11  116701288  208  191  189
11  116701289  209  191  191
11  116701290  208  0    192
11  116701291  208  191  193
11  116701292  210  194  197
11  116701293  209  194  196
11  116701294  213  199  199

如果您想要一个衬垫,请使用:

awk '{k=$1 OFS $2} FNR==NR{v[++n]=k} {a[ARGIND,k] = $3} END{for(j=1; j<=n; j++) {printf "%s", v[j]; for (i=1; i<ARGC; i++) printf "%s", OFS ((i,v[j]) in a ? a[i,v[j]] : 0); print ""}}' File*.txt

column -t用于表格输出。

答案 1 :(得分:1)

您能否请关注awk并告诉我这是否对您有所帮助。

awk 'FNR==NR{a[$1,$2]=$3;next} {a[$1,$2]=a[$1,$2]?a[$1,$2] OFS $3:$3} END{for(i in a){print i,a[i]}}' File*.txt

答案 2 :(得分:0)

这对你有用:

#!/bin/bash
## Assuming all your file are named as *FileN.txt* and so on
endresult="$( awk '{print $1 "\t" $2}'  File1.txt )"
for file in F*.txt
do 

    endresult=$( paste <( echo "$endresult" ) <( awk '{ if(length($3) != 0) { print $3 }else{print 0}}'  $file ) ) 

done

#Replacing empty values for zeroes
endresult=$( echo "$endresult" | awk -v max_rows=$( echo "$endresult" | awk '{print NF}' | sort -r | head -1 ) 'BEGIN{ OFS="\t" }{ for(i=1;i < (max_rows + 1);i++) {  if(length($i) == 0 ){  $i = 0 } } ; print $0}' ) 

编辑:我抓住第一个文件的前两列,因为你说这两个在所有文件中是相同的。

问候!