微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

awk 命令将 8GB 文件拆分为多个文件,每个文件中都有新的文件名和标头

如何解决awk 命令将 8GB 文件拆分为多个文件,每个文件中都有新的文件名和标头

awk 命令将 8GB 文件拆分为多个文件,每个文件中都有新的文件名和标题

我有一个带有 26 个列标题的 8GB 文件。我必须将它分成多个文件,每个文件有 400000 万,包括标题。这意味着每个文件也应该有标题

我尝试了多个命令,但即使我得到了想要的输出,也有一个小问题但很奇怪。

在第 1 行作为标题之后,每隔 50000 行再次插入标题 例如,在使用以下命令后,我得到了 FileName_28062021_1.txt 文件。如果我打开这个文件,我可以在 1st,50001st,100001st,150001st 行看到标题: 不知道如何解决。尝试过的原始命令:

awk '
    NR==1{header=$0; count=1; print header > "FileName_28062021_" count ".txt"; next }
    !( (NR-1) % 399999){count++; print header > "FileName_28062021_" count ".txt";}
    {print $0 > "FileName_28062021_" count ".txt"}
' FileName_28062021-SourceFile.txt
    
SERVERIF:/data1/tempCheckAWK $ wc -l FileName_28062021-NonSplit.txt
46646575 FileName_28062021-NonSplit.txt

尝试了第二个 AWK 命令

SERVERIF:/data1/tempCheckAWK $ vi tempAWK.sh
awk '
NR==1 { header = $0 }
(NR % 400000) == 1 {
close(out)
out = "FileName_28062021_" (++count) ".txt"
print header > out
}
NR>1 { print > out }
' FileName_28062021-NonSplit.txt

SERVERIF:/data1/tempCheckAWK $ sh tempAWK.sh
SERVERIF:/data1/tempCheckAWK $ ls -ltr
Jun 10 13:43 FileName_28062021-NonSplit.txt
Jun 28 23:56 tempAWK.sh
Jun 28 23:59 FileName_28062021_1.txt
Jun 28 23:59 FileName_28062021_2.txt

....

SERVERIF:/data1/tempCheckAWK $wc -l FileName_28062021_1.txt
400000 FileName_28062021_1.txt

SERVERIF:/data1/tempCheckAWK $grep "Transactions Id" FileName_28062021_1.txt
Transactions Id|Transaction Date|Investment Id|External Code
Transactions Id|Transaction Date|Investment Id|External Code
Transactions Id|Transaction Date|Investment Id|External Code
Transactions Id|Transaction Date|Investment Id|External Code
Transactions Id|Transaction Date|Investment Id|External Code
Transactions Id|Transaction Date|Investment Id|External Code
Transactions Id|Transaction Date|Investment Id|External Code
Transactions Id|Transaction Date|Investment Id|External Code

我尝试过 stackoverflow 上提供的其他解决方案。仍然没有运气,标题在第 50000 次重复后重复

解决方法

除了您注意到的问题之外,由于输出重定向右侧的无括号表达式,您现有的脚本将在某些 awk 中失败并出现语法错误,并且它将失败并出现“打开的文件太多”错误由于您没有关闭输出文件而导致其他一些 awk。

做这样的事情,未经测试:

awk '
    NR==1 { header = $0 }
    (NR % 400000) == 1 {
        close(out)
        out = "FileName_28062021_" (++count) ".txt"
        print header > out
    }
    NR>1 { print > out }
' FileName_28062021-SourceFile.txt

如果您不想对输出文件名的部分进行硬编码,而是从输入文件名生成它,请更改:

out = "FileName_28062021_" (++count) ".txt"

out = FILENAME
sub(/-[^-.]+/,"_"(++count),out)

或类似的。

在与 OP 进一步讨论后,输出中重复标题行的问题是由于输入中重复标题行造成的。

,
So when I executed the below command to check the number of occurrences of the header in the input file. it gave me lots of records as given below. So the issue was not there in the AWK command but the input file itself. 

SERVERIF:/data1/tempCheckAWK $grep -n "Transactions Id" FileName_28062021-NonSplit.txt
    1:Transactions Id|Transaction Date|Investment Id|External Code
    50001:Transactions Id|Transaction Date|Investment Id|External Code
    100001:Transactions Id|Transaction Date|Investment Id|External Code
    150001:Transactions Id|Transaction Date|Investment Id|External Code

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。