linux - 如何使用粘贴/加入或 linux 或 perl 以有序方式有效地加入 'n' 个文件?

标签 linux join paste memory-efficient

成千上万的文件以 *.tab 结尾。每个文件的第一列是标题。每个文件都有自己的标题(所以它们是不同的)。我不介意任何文件都有一个标题。

所有文件的行数都相等,因此有一个顺序。我想要的输出具有相同的顺序。

目录中的示例文件

test_1.tab
test_2.tab
.
.
.
.
test_1990.tab
test_2000.tab

test_1.tab

Pro_01 0 0 0 0 0 1 1 1 0 1 1 0 .....0
Pro_02 0 0 0 0 0 1 1 0 0 0 0 0 .....1
Pro_03 1 1 1 1 1 0 0 1 0 1 1 0 .....1
.
.
.
Pro_200 0 0 0 0 1 1 1 1 1 1 0  .....0

test_2000.tab

Pro_1901 1 1 1 1 0 1 1 0 0 0 0 1 .....0
Pro_1902 1 1 1 0 0 0 1 0 0 0 0 0 .....1
Pro_1903 1 1 0 1 0 1 0 0 0 0 0 1 .....1
.
.
.
Pro_2000 1 0 0 0 0 1 1 1 1 1 0  .....0

期望的输出

Pro_01 0 0 0 0 0 1 1 1 0 1 1 0 0 ..... 1 1 1 1 0 1 1 0 0 0 0 1 0
Pro_02 0 0 0 0 0 1 1 0 0 0 0 0 1 ..... 1 1 1 0 0 0 1 0 0 0 0 0 1
Pro_03 1 1 1 1 1 0 0 1 0 1 1 0 1 ..... 1 1 0 1 0 1 0 0 0 0 0 1 1
.
.
.
Pro_200 0 0 0 0 1 1 1 1 1 1 0 0  ..... 1 0 0 0 0 1 1 1 1 1 0 0

我的代码

for i in *.tab/; do paste allCol.tab <(cut -f 2- "$i") > itermediate.csv; mv intermediate.csv allCol.tab ; done

paste <(cut -f1 test1.tab) allCol.tab > final.tab
rm allCol.tab

大概需要 3 个小时。哪种方法更好? 另外,是否有任何其他命令可以交叉检查此输出文件与所有输入文件?喜欢 diff 还是 wc?

最佳答案

试试这个。

#!/bin/bash    

TMP=tmp
mkdir "$TMP"
RESULT=result

#read each file and append the contents of each line in them
#to a new file for each line in the tmp directory 
for f in *.tab; do
    i=1
    while read -r l; do
        echo "$l" >> "$TMP"/"$i"
        ((i++))
    done < <(cut -f2- "$f")
done

#integrate each file in tmp dir into a single line of the $RESULT file
exec 1>>$RESULT    
for f in "$TMP"/*; do
    while read -r l; do
        printf '%s\t' "$l"
    done < <(cat "$f")
    echo
done

rm -r "$TMP"

这个算法可以在多个处理器上拆分,任务会更快地完成。

您还可以向其中添加诸如检查 $TMP 是否已成功创建之类的内容。

关于linux - 如何使用粘贴/加入或 linux 或 perl 以有序方式有效地加入 'n' 个文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38827670/

相关文章:

java - KStreams 确定在连接上保留哪些输入记录时间戳元数据

javascript - 您如何捕获 contentEditable 粘贴事件?

javascript - 捕获粘贴事件/粘贴的 html - javascript

mysql - 获取加入结果的最新记录

mysql - 如何在主选择和连接中访问子查询

html - 使用 htmlOutput 在 Shiny 的应用程序中将矢量渲染为逗号分隔的文本

linux - 未找到 mingw32[64] 安装

linux - struct sched_pa​​ram 中的 sched_priority 指的是什么?

在C中转换和显示图像

linux - 为什么在Linux内核中close函数在 `struct file_operations`调用release?