【问题标题】:Split large file using awk使用 awk 分割大文件
【发布时间】:2017-03-15 00:28:11
【问题描述】:

我有一个大文件,我需要使用第 6 列唯一值进行拆分,但各列之间用 ~ 分隔

如何在 Ubuntu 中使用“awk”命令来实现这一点?我的文本文件很大,有超过 400,000 行。

提前致谢。

    2016~02~ MP~0639161~0090~13~177~0081~02~0200~ .8500~     8.8500~         27.00~0530~9970~                TAYA~1.000~          33.0~          40.0~      8,124 ~        905 ~        425 ~            ~00060~2006~              ~              ~ ~              ~2007~              ~              ~ ~              ~2008~              ~              ~ ~              ~2009~              ~              ~T~          47.0~2010~        481.70~         24.80~A~          19.0~2011~              ~              ~Z~              ~2012~        261.90~         24.80~A~          11.0~2013~              ~              ~Z~              ~2014~      1,349.33~         24.90~A~          54.0~2015~              ~              ~Z~              ~          ~  ~        0.00~          0.00
    2016~02~ MP~0639161~0080~13~177~0081~02~0200~ .8500~     8.8500~         18.40~0530~9970~                TAYA~1.000~          40.0~          45.0~      6,237 ~        554 ~        260 ~            ~00120~2006~              ~              ~ ~              ~2007~              ~              ~ ~              ~2008~              ~              ~ ~              ~2009~              ~              ~ ~              ~2010~              ~              ~T~          47.0~2011~              ~              ~T~          47.0~2012~        211.00~         18.40~A~          11.0~2013~              ~              ~Z~              ~2014~      1,038.34~         18.40~A~          56.0~2015~              ~              ~Z~              ~          ~  ~        0.00~          0.00
    2016~02~ MP~0639166~0020~34~033~0011~02~0102~ .5000~     5.1300~         25.00~0030~0110~                    ~ .500~          62.0~          62.0~      1,988 ~         70 ~         23 ~            ~00170~2004~      5,234.00~        103.70~A~          50.0~2005~      6,481.00~         94.40~A~          69.0~2006~      3,308.00~         56.30~A~          59.0~2007~      6,548.00~         96.10~A~          68.0~2008~      2,679.00~         40.00~A~          67.0~2011~      2,226.00~         39.40~A~          56.0~2012~              ~              ~Z~              ~2013~      1,766.00~         40.00~A~          44.0~2014~      3,129.50~         36.20~A~          86.0~2015~              ~              ~Z~              ~          ~  ~        0.00~          0.00

输出1:

2016~02~ MP~0639161~0090~13~177~0081~02~0200~ .8500~     8.8500~         27.00~0530~9970~                TAYA~1.000~          33.0~          40.0~      8,124 ~        905 ~        425 ~            ~00060~2006~              ~              ~ ~              ~2007~              ~              ~ ~              ~2008~              ~              ~ ~              ~2009~              ~              ~T~          47.0~2010~        481.70~         24.80~A~          19.0~2011~              ~              ~Z~              ~2012~        261.90~         24.80~A~          11.0~2013~              ~              ~Z~              ~2014~      1,349.33~         24.90~A~          54.0~2015~              ~              ~Z~              ~          ~  ~        0.00~          0.00
2016~02~ MP~0639161~0080~13~177~0081~02~0200~ .8500~     8.8500~         18.40~0530~9970~                TAYA~1.000~          40.0~          45.0~      6,237 ~        554 ~        260 ~            ~00120~2006~              ~              ~ ~              ~2007~              ~              ~ ~              ~2008~              ~              ~ ~              ~2009~              ~              ~ ~              ~2010~              ~              ~T~          47.0~2011~              ~              ~T~          47.0~2012~        211.00~         18.40~A~          11.0~2013~              ~              ~Z~              ~2014~      1,038.34~         18.40~A~          56.0~2015~              ~              ~Z~              ~          ~  ~        0.00~          0.00

输出 2:

2016~02~ MP~0639166~0020~34~033~0011~02~0102~ .5000~     5.1300~         25.00~0030~0110~                    ~ .500~          62.0~          62.0~      1,988 ~         70 ~         23 ~            ~00170~2004~      5,234.00~        103.70~A~          50.0~2005~      6,481.00~         94.40~A~          69.0~2006~      3,308.00~         56.30~A~          59.0~2007~      6,548.00~         96.10~A~          68.0~2008~      2,679.00~         40.00~A~          67.0~2011~      2,226.00~         39.40~A~          56.0~2012~              ~              ~Z~              ~2013~      1,766.00~         40.00~A~          44.0~2014~      3,129.50~         36.20~A~          86.0~2015~              ~              ~Z~              ~          ~  ~        0.00~          0.00

【问题讨论】:

  • 完成:请查看我的编辑。
  • 哪一个是你的第六个字段(基于空格或~),拆分后第三个记录发生了什么?
  • 第 6 个字段编号是:在此示例中为 13 和 34,但我在文本文件中有更多第 6 个字段编号。我没有在此处发布示例中的所有行。但是,我希望每个第 6 个字段的唯一编号都有单独的文件,例如基于上述 13 和 34。

标签: ubuntu awk


【解决方案1】:

创建输出文件名,如 13.txt、34.txt、...

第二次运行时,不要忘记删除之前创建的文件,因为它附加了>>

awk -F'~' '{f=$6".txt";  print >> f; close(f)}' file 

创建输出文件名,如 Output_1.txt、Output_2.txt、...

这个负责覆盖,所以第二次运行时不用担心

awk -F'~' '          # call awk set field sep ~
 !($6 in F){         # if $6 as index does not exist in array F then


      # if you want to create filename by 6th field value
      # 13.txt, 34.txt ...
      # then just make F[$6]=$6".txt";

      # Created output file like Output_1.txt, Output_2.txt
      F[$6]="Output_"++i".txt"; 

      # write record to file, close file and go to next line
      print >F[$6]; close(F[$6]); next
 }
 {
   # append record to file, and close file
   print >>F[$6]; close(F[$6])
 }' file

【讨论】:

  • @Akshay:非常感谢。这就是我想要的。非常欣赏它。这正是我想要的。再次感谢。
  • 您可能希望在不使用默认 FS 时修剪空白,否则可能会潜入文件名。
  • @Akshay:您的第二个命令没有产生“Output_49.txt”,但您的第一个命令产生了 49.txt。无论哪种方式,我都可以使用您的第一个命令,这不是问题。再次感谢大家。
  • @user3408139:我编辑了我的帖子,还添加了评论,使用F[$6]=$6".txt",您将获得基于第 6 个字段值的文件名,使用F[$6]="Output_"++i".txt",您将获得增量文件名,而不是基于第 6 个字段的值,我还添加了第一个命令的限制,在第二次运行时它会追加,所以你必须删除新创建的文件
  • @Akshay:是的,我做到了。我双向跑。当我更改为“Output_”++i“.txt”时,它不会生成 Output_49.txt 文件。但是,当我更改为 $6".txt" 时,它会生成 49.txt 文件。我也检查了原始文件,它的第 6 列值为 49。
猜你喜欢
  • 2014-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-02
  • 1970-01-01
相关资源
最近更新 更多