gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:23:45 24 4
gpt4 key购买 nike

成千上万的文件以 *.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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com