bash - 粘贴多个文件,同时排除第一列

标签 bash shell unix

我有一个包含 100 个相同格式文件的目录:

> S43.txt

Gene    S43-A1   S43-A10  S43-A11  S43-A12
DDX11L1 0       0       0       0 
WASH7P  0       0       0       0
C1orf86 0       15      0       1 



> S44.txt

Gene    S44-A1   S44-A10  S44-A11  S44-A12
DDX11L1 0       0       0       0 
WASH7P  0       0       0       0
C1orf86 0       15      0       1 

我想制作一个包含所有文件中所有列的巨大表格,但是当我这样做时:

paste S88.txt S89.txt | column -d '\t' >test.merge

当然,该文件包含两个 'Gene' 列。

  1. 如何一次粘贴目录中的所有文件?

  2. 如何从第一列之后的所有文件中排除第一列?

谢谢。

最佳答案

如果您使用的是 bash,则可以在 paste 中使用进程替换:

paste S43.txt <(cut -d ' ' -f2- S44.txt) | column -t
Gene     S43-A1  S43-A10  S43-A11  S43-A12  S44-A1  S44-A10  S44-A11  S44-A12
DDX11L1  0       0        0        0        0       0        0        0
WASH7P   0       0        0        0        0       0        0        0
C1orf86  0       15       0        1        0       15       0        1

(cut -d$'\t' -f2- S44.txt) 将读取 S44.txt 文件中除第一列以外的所有内容。

要对所有匹配 S*.txt 的文件执行此操作,请使用此代码段:

arr=(S*txt)
file="${arr[1]}"

for f in "${arr[@]:1}"; do
   paste "$file" <(cut -d$'\t' -f2- "$f") > _file.tmp && mv _file.tmp file.tmp
   file=file.tmp
done

# Clean up final output:
column -t file.tmp

关于bash - 粘贴多个文件,同时排除第一列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35186116/

相关文章:

ios -/bin/sh : : No such file or directory Splunk MINT SDK

linux - 在 Unix 中如何读取文件内容并复制到新文件中?

c - 当我们可以使用 return 时,为什么我们使用 pthread_exit()?

c - 写入标准输出时如何在管道中转换为大写

bash - 如何将 terragrunt apply 的输出变量保存为常规 shell 环境变量?

linux - Bash 脚本 : select lines starting with number in specific range

bash - 如果任何命令失败,最后以非零代码退出 shell 脚本

arrays - shell编程: define array including zero-padded values

unix - Solaris与BSD的 'tail -n100'等效吗?

linux - 如何使用 shell 脚本在特定行的文件中写入 xml 标记