【问题标题】:Split text file and rename on the basis of first column根据第一列拆分文本文件并重命名
【发布时间】:2014-12-31 20:29:02
【问题描述】:

我正在尝试拆分一个很长的文本文件,如下所示:

AA1 0.1 0.2 0.3
AA2 0.5 0.6 0.7
AA3 0.5 0.1 0.3

我想将每一行保存在一个单独的文本文件中。我知道 split 命令可以做到这一点,还有以下 awk 命令: awk '{filename = FILENAME NR;打印 > 文件名;关闭(文件名)}'

但我希望每个下一个文件都以这样的第一列命名:

AA1.txt
AA2.txt
AA3.txt

有什么简单的方法吗?

谢谢

【问题讨论】:

    标签: linux bash awk


    【解决方案1】:

    你可以使用一个非常简单的awk脚本作为

    awk '{print $0 > $1".txt"}' inputFile

    将创建文件

    AA1                        
    AA2                        
    AA3
    

    测试

    $ ls AA*
    AA1  AA2  AA3
    
    $ cat AA1
    AA1 0.1 0.2 0.3
    $ cat AA2
    AA2 0.5 0.6 0.7
    $ cat AA3
    AA3 0.5 0.1 0.3
    

    【讨论】:

    • 它应该是$1."txt",如果你不使用引号我不会工作
    【解决方案2】:

    你可以用这个:

    awk '{print >> $1".txt"; close($1".txt")}' input.txt
    

    它使用第一列的值 ($1) 加上扩展名“.txt”作为当前行的输出文件的名称。

    正如您在问题中已经表明的那样,最好在事后关闭文件,因为在大输入文件的第一列中有太多不同的值可能会导致打开的文件描述符过多。


    如果你想省略输出中的第一列 - 因为它不会改变 - 你可以使用这个:

    awk '{for(i=2;i<=NF;i++){printf "%s ", $i >> $1".txt"};printf "\n" >> $1".txt"; close($1".txt")}' input.txt
    

    它从第二个开始遍历每一列,最后添加一个新行。

    【讨论】:

      【解决方案3】:

      您可以通过将输入文本通过管道传输到 awk 或将输入文件用作 awk 的参数来使用以下内容

      cat test.txt | awk '{ print $0 > $1.txt }'
      

      awk '{ print $0 > $1.txt }' test.txt
      

      【讨论】:

      • 这比 Hackaholic 接受的答案要快。
      【解决方案4】:

      使用 awk

      awk '{cmd="echo " $0 ">" $1; system(cmd)}' file
      

      如果你不想要第一列

      awk '{cmd="echo " $2" "$3" "$4 ">" $1  ;system(cmd)}' file
      

      【讨论】:

      • 为什么要为 echo 启动一个外部进程?您可以只使用{print $0 &gt; filename} - 正如其他答案之前所示。你举了一个应该如何做的例子!
      • 没有办法做到这一点
      • 是的,但你为什么建议他们中最糟糕的一个?这也容易受到 shell 代码注入的攻击(零价值)。动态代码创建总是应该小心处理的事情,我认为没有理由在这里使用它。
      猜你喜欢
      • 2017-08-15
      • 2023-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-11
      • 2021-06-25
      • 2019-12-29
      • 1970-01-01
      相关资源
      最近更新 更多