【问题标题】:Split big file in multiple files based on column根据列将大文件拆分为多个文件
【发布时间】:2021-09-22 22:40:19
【问题描述】:

我有一个分号作为分隔符和标题的文件。我想根据日期列拆分该文件。该文件的日期按升序排列。

输出文件的名称应如下: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($2,9,2) substr($2,4,2) substr($2,1,2)
   print > ("01_LPR_" dt "_" dt ".txt")
}' input

【问题讨论】:

    标签: awk


    【解决方案1】:

    你可以试试这个awk:

    awk -F';' '
    NR > 1 {
       dt = substr($2,9,2) substr($2,4,2) substr($2,1,2)
       print > ("01_XX_" dt "_" dt ".txt")
    }' input
    

    对于以下 cmets 中的更新要求:

    awk -F';' '
    NR == 1 {
       hdr = $0
       next
    }
    {
       dt = substr($2,9,2) substr($2,4,2) substr($2,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
    

    【讨论】:

    • 谢谢。有没有办法也有K;V1.00;;;;;;每个文件的开头和末尾的简单字符串,例如每个文件的“END”?我问的原因是因为在分割文件时,我们丢失了标题
    • 可以的。我会在几分钟内更新答案
    • 谢谢,我已经修改了我的评论
    • 我已经更新了我的答案,但是请考虑打开一个新问题以更改要求,因为您可以看到原始命令和新命令非常不同。
    【解决方案2】:

    对于您展示的示例,请尝试遵循awk 代码,这是使用close 函数,该函数也可以避免打开文件过多错误。

    awk -F'\\.| |;' '
    {
      outputFile="01_XX_"substr($4,3)$3 $2"_"substr($4,3)$3 $2".txt"
    }
    FNR>1{
      if(prev!=outputFile){
       close(prev)
      }
      print > (outputFile)
      prev=outputFile
    }
    '  Input_file
    

    【讨论】:

      【解决方案3】:

      试试下面的脚本:

      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
      

      【讨论】:

      • 您好,破坏者,这是根据我的源文件中的月份生成的文件。应该以天为准。所有文件的内容也是 REPLY 而不是实际内容
      • 抱歉,我的错误 - 更新了我的答案(将 REPLY 替换为 $REPLY,将 $myday 替换为 $day。现在应该可以使用了
      猜你喜欢
      • 2022-01-16
      • 2019-09-23
      • 1970-01-01
      • 2019-06-14
      • 1970-01-01
      • 2017-12-14
      • 1970-01-01
      • 2018-09-13
      • 1970-01-01
      相关资源
      最近更新 更多