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



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

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。使用联接,但只能执行两个文件。

您可以使用

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用于表格输出。

您能否尝试遵循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
这将

为你工作:

#!/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}' ) 

编辑:我从第一个文件中抓取前两列,因为您说这两列在所有文件中都是相等的。

问候!

相关内容

最新更新