bash - 在 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
解决方案
无论您有多少文件,这样的东西(未经测试)都应该可以工作:
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]
}
}
'
只有当所有文件的总内容太大而无法放入内存时,它才会失败。
推荐阅读
- nginx - 在 Nginx 中根据主机更改静态根目录
- django - 期间内每天的总点赞数
- javascript - 从 React 中的对象渲染元素列表
- typescript - 为什么我在 Typescript(Angular CLI)中的 FOR 循环之外得到空数组?
- java - 如何在 Spring 中使用 JWT 验证 SockJS CONNECT
- django - 如何在 django 的模板中访问用户详细信息
- python - 多进程 Python:当我尝试时,教程的工作代码不起作用
- python - 如何在 postgres-flask 中为动态值编写 where 条件
- server - 如何在 Goautodial 4 CentOS 7 中安装 let's encrypt ssl?
- c# - ASP.NET Core Identity 中删除登录用户的策略