首页 > 解决方案 > 在 bash/awk/c 中粘贴数百个具有特定模式名称的文件

问题描述

我有 500 个文件,我想通过添加列来合并它们。我的第一个文件

3
4
1
5

我的第二个文件

7
1
4
2

输出应该看起来像

3 7
4 1 
1 4
5 2

但是我有500个文件(sum_1.txt,sum_501.txt直到sum_249501.txt),所以我必须有500列,所以写500个文件名会很沮丧。是否可以更容易地做到这一点?我试试这个,但它不是 500 列,而是很多行

#!/bin/bash
file_name="sum"
tmp=$(mktemp) || exit 1 
touch ${file_name}_calosc.txt
for first in {1..249501..500}
do
paste -d ${file_name}_calosc.txt ${file_name}_$first.txt >> ${file_name}_calosc.txt
done

标签: bashawkpaste

解决方案


无论您有多少文件,这样的东西(未经测试)都应该可以工作:

awk '
    BEGIN {
        for (i=1; i<=249501; i+=500) {
            ARGV[ARGC++] = "sum_" i
        }
    }
    { vals[FNR] = (NR==FNR ? "" : vals[FNR] OFS) $0 }
    END {
        for (i=1; i<=FNR; i++) {
            print vals[i]
        }
    }
'

只有当所有文件的总内容太大而无法放入内存时,它才会失败。


推荐阅读