在排除第一列时粘贴多个文件

时间:2016-02-03 19:37:28

标签: 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. 如何从第一列之后的所有文件中排除第一列?

  3. 谢谢。

2 个答案:

答案 0 :(得分:4)

如果您正在使用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

答案 1 :(得分:3)

使用join和--nocheck-order选项:

join --nocheck-order S43.txt S44.txt | column -t

column -t命令使其漂亮)

但是,正如您所说,您希望加入所有文件,并且一次只加入2个,您应该能够这样做(假设您的shell是bash):

tmp=$(mktemp)
files=(*.txt)

cp "${files[0]}" result.file
for file in "${files[@]:1}"; do
    join --nocheck-order result.file "$file" | column -t > "$tmp" && mv "$tmp" result.file
done