我尝试将cat
所有具有相同名称的文件放在一个文件中并键入。
例如,cat out1.csv out2.csv out3.csv > out.csv
。但我的数据集太大,无法做到这一点;我试过cat out/*.csv > out.csv
。它不起作用。
我是 shell 脚本的初学者。有人可以告诉我我错了什么以及如何解决它吗?
答案1
带壳zsh
:
autoload zargs
zargs -- out<->.csv(n) -- cat > out.csv
将连接名称以 , 开头的所有文件out
,后跟任何十进制数字,然后按.csv
,按n
数字方式排序为out.csv
。如果需要,可以通过将命令拆分为多个命令调用来解决zargs
可传递给命令的参数数量的限制。
使用bash
shell 和 的 GNU 实现xargs
,您可以执行类似的操作:
xargs -r0a <(
shopt -s failglob extglob
pattern='out+([0123456789]).csv' IFS=
printf '%s\0' $pattern | sort -zV) cat > out.csv
答案2
for file in out[0-9]*.csv; do
cat "$file"
done >out.csv
答案3
将 DSU(装饰/排序/取消装饰)习惯用法与任何内置的 Bourne 派生 shell 一起使用printf
,并假设您希望以递增的数字顺序打印输入文件:
printf '%s\n' out[0-9]*.csv |
awk -F'[^0-9]+' -v OFS='\t' '{print $2, $0}' |
sort -k1,1n |
cut -f2- |
xargs cat > out.csv
上述内容适用于名称如 OP 显示的名称的文件,这些文件在其他位置不包含空格或数字。