【问题标题】:awk - how to delete first column with field separatorawk - 如何使用字段分隔符删除第一列
【发布时间】:2013-05-03 02:59:48
【问题描述】:

我有一个 csv 文件,其数据显示如下

87540221|1356438283301|1356438284971|1356438292151697
87540258|1356438283301|1356438284971|1356438292151697
87549647|1356438283301|1356438284971|1356438292151697

我正在尝试将第一列保存到一个新文件中(没有字段分隔符,然后从主 csv 文件中删除第一列以及第一个字段分隔符。

有什么想法吗?

这是我迄今为止尝试过的

awk 'BEGIN{FS=OFS="|"}{$1="";sub("|,"")}1'

但它不起作用

【问题讨论】:

  • 剪辑呢? cut -d '|' -f 2-

标签: linux shell awk


【解决方案1】:

这很简单,cut:

$ cut -d'|' -f1 infile
87540221
87540258
87549647

$ cut -d'|' -f2- infile
1356438283301|1356438284971|1356438292151697
1356438283301|1356438284971|1356438292151697
1356438283301|1356438284971|1356438292151697

只需重定向到你想要的文件:

$ cut -d'|' -f1 infile > outfile1

$ cut -d'|' -f2- infile > outfile2 && mv outfile2 file 

【讨论】:

    【解决方案2】:

    假设您的原始 CSV 文件名为“orig.csv”:

    awk -F'|' '{print $1 > "newfile"; sub(/^[^|]+\|/,"")}1' orig.csv > tmp && mv tmp orig.csv
    

    【讨论】:

    • awk 解决方案的运行速度比 cut 快 20 倍。在 15Gb CSV 文件上测试。
    • 我从没想过会这样。感谢您的信息。
    【解决方案3】:

    GNU awk

    awk '{$1="";$0=$0;$1=$1}1' FPAT='[^|]+' OFS='|'
    

    输出

    1356438283301|1356438284971|1356438292151697
    1356438283301|1356438284971|1356438292151697
    1356438283301|1356438284971|1356438292151697
    

    【讨论】:

      【解决方案4】:

      管道是特殊的正则表达式符号,子函数希望您传递正则表达式。正确的 awk 命令应该是这样的:

      awk 'BEGIN {FS=OFS="|"} {$1=""; sub(/\|/, "")}'1 file
      

      输出:

      1356438283301|1356438284971|1356438292151697
      1356438283301|1356438284971|1356438292151697
      1356438283301|1356438284971|1356438292151697
      

      【讨论】:

        【解决方案5】:

        sed

        sed 's/[^|]*|//' file.txt
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-11-01
          • 2018-02-07
          • 2020-11-24
          • 2014-04-27
          • 2011-02-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多