ubuntu - 使用awk拆分大文件

标签 ubuntu awk

我有一个大文件,我需要使用第 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

最佳答案

创建输出文件名,如 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

关于ubuntu - 使用awk拆分大文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42789693/

相关文章:

linux - 每天在带有 Linux Ubuntu 的 Google Compute Engine 上运行 python 文件

ubuntu - 如何在服务器上运行 Scrapyd

Bash:查找具有最大行数的文件

regex - 如何在awk中获取regExp的子表达式值?

regex - 如何通过awk中的转义双引号替换双引号?

ubuntu - 奇怪的文件未找到错误

postgresql - repmgr 错误 : A master must be defined before configuring a slave

memory - awk 中的关联数组挑战内存限制

sed - 在包含关键字的行的开头和结尾插入标签

ubuntu - 重新启动后无法启动 Shiny 的服务器