【问题标题】:Combining multiple groups of text files with bash使用 bash 组合多组文本文件
【发布时间】:2018-02-21 11:25:03
【问题描述】:

我有一个包含如下标签的文本文件文件夹:

0filename1
1filename1
2filename1
....
0filename2
1filename2
2filename2
....

等等。我想要做的是以filename1 结尾的所有文件并将它们全部组合成一个名为filename1 的文件,对于filename2 和所有其他文件也是如此。通常我会做这样的事情

cat [0123456789]*filename1 > filename1

然后对我拥有的每个不同的文件名重复该命令。但是,我希望能够自动执行此操作。文件名的确切形式定期更改,因此它不像编写一个脚本那样简单,该脚本将对文件名 1、文件名 2 等执行上述命令。文件名的长度确实保持不变,所以我怀疑是正确的方法要自动执行此操作,脚本将获取文件名中具有相同最后 n 个字符的每个文件,并将它们复制到具有这些 n 个字符名称的文件中。不过我不知道该怎么做 - 有什么建议吗?

【问题讨论】:

    标签: bash


    【解决方案1】:

    听起来很简单,只需要过滤文件以获得'base'字符串。

    for $base in $( ls | cut -b 1-8 | sort -u ); do
        cat [0123456789]*$base > $base
    done
    

    其中1-8 是您打算保留 的字符,因此 - 8。

    【讨论】:

      【解决方案2】:
      #!/bin/bash
      
      str="filename"
      for i in {1..2}
      do
          cat {?,??}"${str}${i}" > "${str}${i}"
      done
      

      脚本使用 Bash 扩展 {..} 和字符通配符 ? 来扩展可用的文件名。如果您有0filename19filename1,则使用单个? 并将?? 用于10filename1-99filename1

      例子:

      $ cat 0filename1 
      011
      $ cat 1filename1 
      111
      $ cat 2filename1 
      211
      $ cat 10filename1 
      1011
      $ cat 0filename2
      022
      $ cat 1filename2
      122
      $ cat 2filename2
      222
      $ cat 10filename2
      1022
      

      上述脚本的输出是:

      $ cat filename1
      011
      111
      211
      1011
      
      $ cat filename2
      022
      122
      222
      1022
      

      【讨论】:

        【解决方案3】:

        处理带有空格字符、多位数字或灵活文件名长度的文件的复杂解决方案:

        #!/usr/bin/env bash
        
        shopt -s extglob nullglob
        
        files=(+([0-9])?*)
        (( ${#files[@]} )) || exit 1
        
        while IFS= read -rd '' filename; do
            printf '%s\0' +([0-9])"$filename" | sort -zn | xargs -0 cat > "$filename"
        done < <(printf '%s\0' "${files[@]##+([0-9])}" | sort -zu)
        

        【讨论】:

          猜你喜欢
          • 2015-12-19
          • 2012-09-04
          • 2020-06-08
          • 2023-03-22
          • 1970-01-01
          • 2015-05-28
          • 2020-08-04
          • 1970-01-01
          • 2012-01-23
          相关资源
          最近更新 更多