【问题标题】:AWK Shift empty column to left (to start position) [duplicate]AWK将空列向左移动(到起始位置)[重复]
【发布时间】:2014-06-11 09:11:02
【问题描述】:

输入:

fofo jojo tst

fojo jofo sts

rhr hrhh 渡渡鸟

  jojo hoho jojo

  zozo roro vovo

输出:

fofo jojo tst

佛乔乔佛

rhr hrhh 渡渡鸟

嗬嗬嗬嗬

小豆豆

注意:请帮助我,我需要移动第一列为空的所有行。每个字段都是制表符分隔的。在这个文件中,一些行从第一列开始,但一些行从第二列或第三列开始。 谢谢

【问题讨论】:

    标签: awk sed shift


    【解决方案1】:

    你可以这样做:

    awk '{$1=$1}1' file
    fofo jojo tst
    
    fojo jofo sts
    
    rhr hrhh dodo
    
    jojo hoho jojo
    
    zozo roro vovo
    

    你也可以使用awk '$1=$1',但这也会删除空行和以0开头的行


    如果文件是制表符分隔:

    cat file
    fofo    jojo    tst
    
    fojo    jofo    sts
    
    rhr     hrhh    dodo
    
            jojo    hoho    jojo
    
            zozo    roro    vovo
    

    awk '{$1=$1}1' OFS="\t" file
    fofo    jojo    tst
    
    fojo    jofo    sts
    
    rhr     hrhh    dodo
    
    jojo    hoho    jojo
    
    zozo    roro    vovo
    

    这将删除第一个数据前面的所有空格/制表符,而不会更改文件格式:

    awk '{sub(/^[[:space:]]*/,"")}1' file
    fofo    jojo    tst
    
    fojo    jofo    sts
    
    rhr     hrhh    dodo
    
    jojo    hoho    jojo
    
    zozo    roro    vovo
    

    【讨论】:

    • {$1=$1}(无论有无OFS=\t)将“重新格式化”该行,即a\tb\t\t\t\tc将变为a\tb\tc。这可能是个问题。至少 OP 没有提到这个需求。
    • @kent 如果我使用这些数据 a\tb\t\t\t\tc 我会从我的 gnu awk a\tb\t\t\t\tc 得到这个输出,所以至少在我的情况下这不是真的。
    • 我刚刚用你的awk '{$1=$1}1' OFS="\t" file 测试了像a<tab>b<tab><tab><tab>c 这样的文件中的一行将在这里变成a<tab>b<tab>c。我希望我没有做错任何事。
    • @Kent 那我明白你了,我以为你把它删除了字符 \t 而不是标签。但是,是的,它会重新格式化文件,所以如果这是一个问题,最好使用我的最后一个 awk,它的作用与你的 sed 相同
    【解决方案2】:

    喜欢这个

    sed 's/^\s*//' file
    

    还是我没理解要求对吧?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-19
      • 2014-06-14
      相关资源
      最近更新 更多