根据列将大文件拆分为多个文件
Split big file in multiple files based on column
我有一个以分号作为分隔符和 headers 的文件。我想根据日期列拆分该文件。该文件的日期按升序排列。
输出文件的名称应如下所示:01_XX_YYMMDD_YYMMDD.txt
例如 01_XX_210920_210920.txt
这是一个示例文件:
--INPUT
K;V1.00;;;;;;
P;01.01.2021 00:01;16;EXA;31;TESTA;95.9;XXXX
P;01.01.2021 00:02;33;EXA;31;TESTA;95.9;XYXY
P;02.01.2021 00:54;16;EXB;33;TESTB;94.0;DWAD
P;02.01.2021 00:56;11;EXB;33;TESTB;94.0;DADA
P;03.01.2021 01:00;16;EXC;32;TESTC;94.6;WEWEQ
P;03.01.2021 01:22;16;EXC;32;TESTC;94.6;QEQR
P;04.01.2021 02:39;16;EXD;33;TESTD;94.3;DFAG
输出结果如下,以之前的文件为例
--OUTPUT FILES
FILE1: 01_XX_210101_210101.txt
P;01.01.2021 00:01;16;EXA;31;TESTA;95.9;XXXX
P;01.01.2021 00:02;33;EXA;31;TESTA;95.9;XYXY
FILE2: 01_XX_210102_210102.txt
P;02.01.2021 00:54;16;EXB;33;TESTB;94.0;DWAD
P;02.01.2021 00:56;11;EXB;33;TESTB;94.0;DADA
FILE3: 01_XX_210103_210103.txt
P;03.01.2021 01:00;16;EXC;32;TESTC;94.6;WEWEQ
P;03.01.2021 01:22;16;EXC;32;TESTC;94.6;QEQR
FILE4: 01_XX_210104_210104.txt
P;04.01.2021 02:39;16;EXD;33;TESTD;94.3;DFAG
我试过 AWK 但没有成功,因为我的文件有时间戳……
谢谢!
x
更新:解决方案
awk -F';' '
NR > 1 {
dt = substr(,9,2) substr(,4,2) substr(,1,2)
print > ("01_LPR_" dt "_" dt ".txt")
}' input
尝试以下脚本:
while read; do
day=${REPLY:2:2}
month=${REPLY:5:2}
year=${REPLY:10:2}
echo "$REPLY" >> 01_XX_${year}${month}${day}_${year}${month}${day}.txt
done<inputfile.txt
或“oneline”中的相同:
while read do echo "$REPLY" >> 01_XX_${REPLY:10:2}${REPLY:5:2}${REPLY:2:2}_${REPLY:10:2}${REPLY:5:2}${REPLY:2:2}.txt; done<inputfile.txt
你可以试试这个awk
:
awk -F';' '
NR > 1 {
dt = substr(,9,2) substr(,4,2) substr(,1,2)
print > ("01_XX_" dt "_" dt ".txt")
}' input
更新后的要求请在下方评论:
awk -F';' '
NR == 1 {
hdr = [=11=]
next
}
{
dt = substr(,9,2) substr(,4,2) substr(,1,2)
}
dt != pdt {
if (pdt) {
print "END" > fn
close(fn)
}
fn = "01_XX_" dt "_" dt ".txt"
print hdr > fn
}
{
print > fn
pdt = dt
}
END {
print "END" > fn
close(fn)
}' input
使用您显示的示例,请尝试遵循 awk
代码,这是使用 close
函数,该函数也会避免打开太多文件的错误。
awk -F'\.| |;' '
{
outputFile="01_XX_"substr(,3) "_"substr(,3) ".txt"
}
FNR>1{
if(prev!=outputFile){
close(prev)
}
print > (outputFile)
prev=outputFile
}
' Input_file
我有一个以分号作为分隔符和 headers 的文件。我想根据日期列拆分该文件。该文件的日期按升序排列。
输出文件的名称应如下所示:01_XX_YYMMDD_YYMMDD.txt
例如 01_XX_210920_210920.txt
这是一个示例文件:
--INPUT
K;V1.00;;;;;;
P;01.01.2021 00:01;16;EXA;31;TESTA;95.9;XXXX
P;01.01.2021 00:02;33;EXA;31;TESTA;95.9;XYXY
P;02.01.2021 00:54;16;EXB;33;TESTB;94.0;DWAD
P;02.01.2021 00:56;11;EXB;33;TESTB;94.0;DADA
P;03.01.2021 01:00;16;EXC;32;TESTC;94.6;WEWEQ
P;03.01.2021 01:22;16;EXC;32;TESTC;94.6;QEQR
P;04.01.2021 02:39;16;EXD;33;TESTD;94.3;DFAG
输出结果如下,以之前的文件为例
--OUTPUT FILES
FILE1: 01_XX_210101_210101.txt
P;01.01.2021 00:01;16;EXA;31;TESTA;95.9;XXXX
P;01.01.2021 00:02;33;EXA;31;TESTA;95.9;XYXY
FILE2: 01_XX_210102_210102.txt
P;02.01.2021 00:54;16;EXB;33;TESTB;94.0;DWAD
P;02.01.2021 00:56;11;EXB;33;TESTB;94.0;DADA
FILE3: 01_XX_210103_210103.txt
P;03.01.2021 01:00;16;EXC;32;TESTC;94.6;WEWEQ
P;03.01.2021 01:22;16;EXC;32;TESTC;94.6;QEQR
FILE4: 01_XX_210104_210104.txt
P;04.01.2021 02:39;16;EXD;33;TESTD;94.3;DFAG
我试过 AWK 但没有成功,因为我的文件有时间戳…… 谢谢!
x
更新:解决方案
awk -F';' '
NR > 1 {
dt = substr(,9,2) substr(,4,2) substr(,1,2)
print > ("01_LPR_" dt "_" dt ".txt")
}' input
尝试以下脚本:
while read; do
day=${REPLY:2:2}
month=${REPLY:5:2}
year=${REPLY:10:2}
echo "$REPLY" >> 01_XX_${year}${month}${day}_${year}${month}${day}.txt
done<inputfile.txt
或“oneline”中的相同:
while read do echo "$REPLY" >> 01_XX_${REPLY:10:2}${REPLY:5:2}${REPLY:2:2}_${REPLY:10:2}${REPLY:5:2}${REPLY:2:2}.txt; done<inputfile.txt
你可以试试这个awk
:
awk -F';' '
NR > 1 {
dt = substr(,9,2) substr(,4,2) substr(,1,2)
print > ("01_XX_" dt "_" dt ".txt")
}' input
更新后的要求请在下方评论:
awk -F';' '
NR == 1 {
hdr = [=11=]
next
}
{
dt = substr(,9,2) substr(,4,2) substr(,1,2)
}
dt != pdt {
if (pdt) {
print "END" > fn
close(fn)
}
fn = "01_XX_" dt "_" dt ".txt"
print hdr > fn
}
{
print > fn
pdt = dt
}
END {
print "END" > fn
close(fn)
}' input
使用您显示的示例,请尝试遵循 awk
代码,这是使用 close
函数,该函数也会避免打开太多文件的错误。
awk -F'\.| |;' '
{
outputFile="01_XX_"substr(,3) "_"substr(,3) ".txt"
}
FNR>1{
if(prev!=outputFile){
close(prev)
}
print > (outputFile)
prev=outputFile
}
' Input_file