【问题标题】:linux + what the best way to merge fileslinux + 什么是合并文件的最佳方式
【发布时间】:2014-07-11 04:15:39
【问题描述】:

我在 /var/tmp 目录下有以下文件(超过 80 个文件)

 report1.txt
 report2.txt
 report3.txt
 .
 .
 .
 .
 .

合并所有文件的最佳方法是:report[1-N].txt到一个文件

现在我执行以下步骤以将所有文件合并到一个文件中(但这种方式并不优雅..)

cat report1.txt >> report2.txt
cat report2.txt >> report3.txt
.
.
.
 .

【问题讨论】:

    标签: linux bash awk sed ksh


    【解决方案1】:

    你可以使用brace expansion:

    cat report{1..80} > allreports.txt
    

    编辑:根据您的 cmets,您想使用一个变量。由于大括号扩展发生在变量扩展之前,因此您不能在大括号内使用变量。另一种方法是使用自定义格式的seq:

    cat $(seq -f "report%g.txt" $NUM) > allreports.txt
    

    其中NUM 是您要传递的变量。默认情况下,序列将从 1 开始。如果要更改它,请同时指定第一个和最后一个数字(或变量):

    cat $(seq -f "report%g.txt" $start $end) > allreports.txt
    

    【讨论】:

    • 不错的解决方案 -:) +1 为您服务
    • 但是如果我无法验证文件总数,那么您的解决方案是什么? (80 可以是其他数字),我可以在 80 处设置一些 VAL 来计算所有文件吗?
    • @maihabunash 不,大括号扩展发生在变量扩展之前。因此,您不能将变量与{..} 一起使用。一种方法可能是使用 glob,但这并不能保证保留顺序。因此,在这种情况下,你会出现一个循环。
    • 是的,你说得对 - 但我仍然无法验证最后一个数字是什么,而且这个数字每次都会改变(取决于我们有多少文件) -:(
    【解决方案2】:

    您可以使用*

    cat report* > newfile
    

    它将把所有以report开头的文件放到一个新文件中

    【讨论】:

    • 但如果我也有文件为 report@.txt ,我们只想合并具有此规则的文件 - report1-N.txt (而 N 是整数
    • @maihabunash 那么devnull的解决方案会更好。
    • 几乎,report80whatever.txt 也被采用,...@maihabunash,定义更多文件名约定的范围以选择以便可以调整 2 回复。
    猜你喜欢
    • 1970-01-01
    • 2010-09-08
    • 1970-01-01
    • 2011-04-10
    • 1970-01-01
    • 2013-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多