bash - 按列合并文本文件 : two column common and append third column form all files

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

最佳答案

您可以使用这个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 用于表格输出。

关于bash - 按列合并文本文件 : two column common and append third column form all files,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49326960/

相关文章:

bash - 是否可以在 crontab 中以 root 身份运行 Bash 文件?

shell - @D 在 shell 脚本中是什么意思

file - 我想用 sed 命令编辑特定行(多行)

bash - 如果找到则使用 awk 替换特定列值

bash - 如何使用 awk 按天将带时间戳的日志文件拆分为多个文件

linux - 使用 Go 运行带参数的 sh/bash/python 脚本

macos - 如何在 Mac OS X Snow Leopard 上运行 bash 脚本?

bash - 如何从 Gitlab 下载私有(private)存储库而不暴露 url 中的访问 token ?

swift - 在 Swift 脚本中使用管道链接 shell 命令

android - 如何从 adb 在 Android 模拟器上启动和执行 Vending.apk