我有一个包含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'
列。
如何一次粘贴目录中的所有文件?
如何从第一列之后的所有文件中排除第一列?
谢谢。
答案 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