-1

awk 命令将 8GB 文件拆分为多个文件,根据每个文件中具有新文件名和标题的行数

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

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

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

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 次后重复后重复

4

2 回答 2

0

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

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

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 进行更多讨论后,输出中重复标题行的问题是由于输入中重复标题行所致。

于 2021-06-28T16:32:31.333 回答
0
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
于 2021-06-28T19:26:30.133 回答