awk 命令将一个 8GB 的文件拆分为多个文件,每个文件中具有新文件名和 header 的行数
awk command to split an 8GB file into multiple files basis number of rows with new filename and header in each file
awk 命令将一个 8GB 的文件拆分为多个文件,每个文件中具有新文件名的行数和 header
我有一个包含 26 列 header 的 8GB 文件。我必须将它分成多个文件,每个文件有 400000 万卢比,包括 header。这意味着每个文件也应该有 header。
我已经尝试了多个命令,但即使我得到了所需的输出,也有 一个小问题,但很奇怪。
在第 1 行 header 之后,每隔 50000 行再次插入 header。
例如,在使用以下命令后,我得到了 FileName_28062021_1.txt 文件。如果我打开这个文件,我可以在第 1、50001、100001、150001 行看到 header:
不知道如何解决它。尝试过的原始命令:
awk '
NR==1{header=[=11=]; count=1; print header > "FileName_28062021_" count ".txt"; next }
!( (NR-1) % 399999){count++; print header > "FileName_28062021_" count ".txt";}
{print [=11=] > "FileName_28062021_" count ".txt"}
' FileName_28062021-SourceFile.txt
SERVERIF:/data1/tempCheckAWK $ wc -l FileName_28062021-NonSplit.txt
46646575 FileName_28062021-NonSplit.txt
Second AWK command tried
SERVERIF:/data1/tempCheckAWK $ vi tempAWK.sh
awk '
NR==1 { header = [=12=] }
(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
我已经尝试过Whosebug 上提供的其他解决方案。仍然不走运,header 在第 50000
次后重复
除了您注意到的问题之外,由于输出重定向右侧未加括号的表达式,您现有的脚本在某些 awk 中会因语法错误而失败,并且会因“打开的文件过多”而失败由于您没有关闭输出文件,其他一些 awk 出现错误。
做这样的事情,未经测试:
awk '
NR==1 { header = [=10=] }
(NR % 400000) == 1 {
close(out)
out = "FileName_28062021_" (++count) ".txt"
print header > out
}
NR>1 { print > out }
' FileName_28062021-SourceFile.txt
如果您不想 hard-code 部分输出文件名,而是从输入文件名生成它,则更改:
out = "FileName_28062021_" (++count) ".txt"
至
out = FILENAME
sub(/-[^-.]+/,"_"(++count),out)
或类似。
在与 OP 进行更多讨论后,输出中重复 header 行的问题是由于输入中重复 header 行造成的。
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
awk 命令将一个 8GB 的文件拆分为多个文件,每个文件中具有新文件名的行数和 header
我有一个包含 26 列 header 的 8GB 文件。我必须将它分成多个文件,每个文件有 400000 万卢比,包括 header。这意味着每个文件也应该有 header。
我已经尝试了多个命令,但即使我得到了所需的输出,也有 一个小问题,但很奇怪。
在第 1 行 header 之后,每隔 50000 行再次插入 header。 例如,在使用以下命令后,我得到了 FileName_28062021_1.txt 文件。如果我打开这个文件,我可以在第 1、50001、100001、150001 行看到 header: 不知道如何解决它。尝试过的原始命令:
awk '
NR==1{header=[=11=]; count=1; print header > "FileName_28062021_" count ".txt"; next }
!( (NR-1) % 399999){count++; print header > "FileName_28062021_" count ".txt";}
{print [=11=] > "FileName_28062021_" count ".txt"}
' FileName_28062021-SourceFile.txt
SERVERIF:/data1/tempCheckAWK $ wc -l FileName_28062021-NonSplit.txt
46646575 FileName_28062021-NonSplit.txt
Second AWK command tried
SERVERIF:/data1/tempCheckAWK $ vi tempAWK.sh
awk '
NR==1 { header = [=12=] }
(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
我已经尝试过Whosebug 上提供的其他解决方案。仍然不走运,header 在第 50000
次后重复除了您注意到的问题之外,由于输出重定向右侧未加括号的表达式,您现有的脚本在某些 awk 中会因语法错误而失败,并且会因“打开的文件过多”而失败由于您没有关闭输出文件,其他一些 awk 出现错误。
做这样的事情,未经测试:
awk '
NR==1 { header = [=10=] }
(NR % 400000) == 1 {
close(out)
out = "FileName_28062021_" (++count) ".txt"
print header > out
}
NR>1 { print > out }
' FileName_28062021-SourceFile.txt
如果您不想 hard-code 部分输出文件名,而是从输入文件名生成它,则更改:
out = "FileName_28062021_" (++count) ".txt"
至
out = FILENAME
sub(/-[^-.]+/,"_"(++count),out)
或类似。
在与 OP 进行更多讨论后,输出中重复 header 行的问题是由于输入中重复 header 行造成的。
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