【问题标题】:Remove eveything before including colon and replace comma to newline在包括冒号之前删除所有内容并将逗号替换为换行符
【发布时间】:2022-01-12 15:36:36
【问题描述】:

我只是希望将我的查询容纳到单行中。

我有一个下面的文件内容,我想删除最后一个冒号(:)之前的所有内容,包括它自己,然后将逗号(,)替换为换行符以获得所需的结果。

这些所有逗号分隔的值都是 linux 用户 ID

文件内容:

pa_tools:x:2998:nep08569,nep08623,nep14587,kpc12117,tpa06038,tpa10226,tpa14459,tpa14596,tpa21272,tpa28233,tpa32495,cpf30049,cpf32734,cpf38753,cpf41124,cpf41645,cpf42488,cpf42609,cpf54284,cpf55701,cpf56556,cpf61223,cpf64941,cpf66553,cpf69011,cpf72912,pfc37974,pfc40981,pfc48626,pfc69581,pfc80043,pfc82969,pfc84163,pfc87399,pfc87990,pfc87991,pfc98638,pa_tools_rs

已经尝试过:

工作解决方案:

1- $  sed -e  's/.*://g' -e  's/\,/\n/g' test_g

2- $ awk -F: '{print $NF}'  test_g| awk 'BEGIN{RS=","}{$1=$1}1'

3- $ cat test_g| tr "," "\n"| tr ":" "\n" | sed '1,3d'

结果:

$  sed -e  's/.*://g' -e  's/\,/\n/g' test_g
nep08569
nep08623
nep14587
kpc12117
tpa06038
tpa10226
tpa14459
tpa14596
tpa21272
tpa28233
tpa32495
cpf30049
cpf32734
cpf38753
cpf41124
cpf41645
cpf42488
cpf42609
cpf54284
cpf55701
cpf56556
cpf61223
cpf64941
cpf66553
cpf69011
cpf72912
pfc37974
pfc40981
pfc48626
pfc69581
pfc80043
pfc82969
pfc84163
pfc87399
pfc87990
pfc87991
pfc98638
pa_tools_rs

有没有更好的技巧,请指教。

【问题讨论】:

    标签: linux awk sed


    【解决方案1】:

    您可以在awk 的任何版本上使用此解决方案:

    awk -F: '{$0 = $NF; gsub(/,/, "\n")} 1' file
    
    nep08569
    nep08623
    nep14587
    kpc12117
    tpa06038
    tpa10226
    tpa14459
    tpa14596
    tpa21272
    tpa28233
    tpa32495
    cpf30049
    cpf32734
    cpf38753
    cpf41124
    cpf41645
    cpf42488
    cpf42609
    cpf54284
    cpf55701
    cpf56556
    cpf61223
    cpf64941
    cpf66553
    cpf69011
    cpf72912
    pfc37974
    pfc40981
    pfc48626
    pfc69581
    pfc80043
    pfc82969
    pfc84163
    pfc87399
    pfc87990
    pfc87991
    pfc98638
    pa_tools_rs
    

    使用gnu-sed 将类似于您尝试的代码:

    sed 's/.*://; s/,/\n/g' file
    

    【讨论】:

      【解决方案2】:

      使用sed

      $ sed 's/.*:\([^,]*\)\|,/\n\1/g' input_file
      
      nep08569
      nep08623
      nep14587
      kpc12117
      tpa06038
      tpa10226
      tpa14459
      tpa14596
      tpa21272
      tpa28233
      tpa32495
      cpf30049
      cpf32734
      cpf38753
      cpf41124
      cpf41645
      cpf42488
      cpf42609
      cpf54284
      cpf55701
      cpf56556
      cpf61223
      cpf64941
      cpf66553
      cpf69011
      cpf72912
      pfc37974
      pfc40981
      pfc48626
      pfc69581
      pfc80043
      pfc82969
      pfc84163
      pfc87399
      pfc87990
      pfc87991
      pfc98638
      pa_tools_rs
      

      【讨论】:

        【解决方案3】:

        sed:

        sed 's/.*://; s/,/\n/g' file
        # needs to be a sed the supports \n
        # GNU and recent BSD do support \n but that is a superset
        # of POSIX
        

        如果您的 sed 不支持替换 \n,则使用文字转义的新行:

        sed 's/.*://; s/,/\
        /g' file
        

        或者使用tr,替换为\n

        sed 's/.*://' file | tr ',' '\n'
        

        全部三个打印:

        nep08569
        nep08623
        nep14587
        ...
        pfc87991
        pfc98638
        pa_tools_rs
        

        【讨论】:

        【解决方案4】:

        data=$(< test_g)                    # read the file
        id_csv=${data##*:}                  # remove the prefix
        IFS=, read -ra ids <<< "$id_csv"    # split into an array
        

        最后两步可以合并

        IFS=, read -ra ids <<< "${data##*:}"
        

        然后,输出以下之一:

        printf '%s\n' "${ids[@]}"
        
        (IFS=$'\n'; echo "${ids[*]}")
        
        join() { local IFS=$1; shift; echo "$*"; }
        join $'\n' "${ids[@]}"
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-11-30
          • 1970-01-01
          • 2016-01-28
          • 1970-01-01
          • 1970-01-01
          • 2015-10-05
          相关资源
          最近更新 更多