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