【问题标题】:How to cut column data from flat file如何从平面文件中剪切列数据
【发布时间】:2017-10-11 20:39:03
【问题描述】:

我有以下格式的数据;

111,Ja,M,Oes,2012-08-03 16:42:00,x,xz
112,Ln,d,D,Gn,2012-08-03 16:51:00,y,yx

我需要按以下顺序创建包含数据的文件:

111,x,xz
112,y,yz

在输出格式中,我们在逗号之前的第一个值和最后两个逗号前缀值。在这里,我们可以在中间有任意数量的逗号。

请指教,如何在 Linux 机器中从输入文件生成所需的输出文件。

【问题讨论】:

  • 一行中的逗号数能否因行而异?
  • 我尝试在 SQL Server 中上传数据;然后意识到有多个逗号破坏了 csv 上传。
  • @fancyPants 是的;一行中的逗号数量因行而异。我们只需要每行中的第一个和最后两个值。

标签: linux shell text awk sed


【解决方案1】:
awk '{print substr($1,1,4) substr($2,10,4)}' file

111,x,xz
112,y,yx

【讨论】:

    【解决方案2】:

    sed

    $ sed -r 's/([^,]+).*(,[^,]+,[^,]+)/\1\2/' file
    111,x,xz
    112,y,yx
    

    $ sed -r 's/([^,]+).*((,[^,]+){2})/\1\2/' file
    

    【讨论】:

      【解决方案3】:

      在 awk 中对这一点并不多:

      awk -F"," 'BEGIN{OFS=","}{print $1,$(NF-1), $NF}' inFile > outFile
      

      我们用逗号-F"," 分隔awk 中的行,然后打印第一个字段$1、倒数第二个字段$(NF-1) 和最后一个字段$NF

      NF 是“字段数”,因此从中减去 1 将为您提供倒数第二项。

      【讨论】:

        【解决方案4】:

        Awk 对此的声明非常直截了当。设置输入输出字段分隔符,并使用$1..$NF打印字段,其中$NF是最后一列的值,

        awk 'BEGIN{FS=OFS=","}{print $1,$(NF-1),$NF}' input.csv > newfile.csv
        

        【讨论】:

          猜你喜欢
          • 2023-04-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-05-29
          • 2021-10-25
          • 2014-06-06
          • 2011-04-14
          • 2013-09-27
          相关资源
          最近更新 更多