【问题标题】:awk print something if column is empty如果列为空,awk 打印一些东西
【发布时间】:2015-10-14 15:36:30
【问题描述】:

我正在尝试一个脚本,其中文件 [ file.txt ] 有很多列,例如

abc|pqr|lmn|123
pqr|xzy|321|azy
lee|cha| |325
xyz| |abc|123

我想在 bash 脚本中使用 awk 命令获取列列表,如果列是空的,它应该打印 blank 否则打印 列值

我已经尝试了以下可能性,但它不起作用

cat file.txt | awk -F "|" {'print $2'} | sed -e 's/^$/blank/' // Using awk and sed
cat file.txt | awk -F "|" '!$2 {print "blank"} '
cat file.txt | awk -F "|" '{if  ($2 =="" ) print "blank" } '

请告诉我如何使用 awk 或任何其他 bash 工具来做到这一点。

谢谢

【问题讨论】:

    标签: bash awk sed


    【解决方案1】:

    你可以像这样使用 awk:

    awk 'BEGIN{FS=OFS="|"} {for (i=1; i<=NF; i++) if ($i ~ /^ *$/) $i="blank"} 1' file
    abc|pqr|lmn|123
    pqr|xzy|321|azy
    lee|cha|blank|325
    xyz|blank|abc|123
    

    【讨论】:

      【解决方案2】:

      您可以使用这个sed 脚本来做到这一点:

      sed -r 's/\| +\|/\|blank\|/g' File
      abc|pqr|lmn|123
      pqr|xzy|321|azy
      lee|cha|blank|325
      xyz|blank|abc|123
      

      如果你不想要|

      sed -r 's/\| +\|/\|blank\|/g; s/\|/ /g' File
      abc pqr lmn 123
      pqr xzy 321 azy
      lee cha blank 325
      xyz blank abc 123
      

      否则awk:

      awk '{gsub(/\| +\|/,"|blank|")}1' File
      abc|pqr|lmn|123
      pqr|xzy|321|azy
      lee|cha|blank|325
      xyz|blank|abc|123
      

      【讨论】:

        【解决方案3】:

        我认为你正在寻找的是

        awk -F '|' '{print match($2, /[^ ]/) ? $2 : "blank"}' file.txt
        

        match(str, regex) 返回正则表达式第一个匹配项在str 中的位置,如果没有匹配项,则返回 0。所以在这种情况下,如果字段 2 中有一些非空白字符,它将返回一个非零值。请注意,在 awk 中,字符串中第一个字符的索引是 1,而不是 0。

        在这里,我假设您只对单个列感兴趣。

        如果您希望能够从 bash 变量中指定替换字符串,最好的解决方案是使用 -v 开关将 bash 变量传递给 awk 程序:

        awk -F '|' -v blank="$replacement" \
            '{print match($2, /[^ ]/) ? $2 : blank}' file.txt
        

        这种机制避免了转义元字符的问题。

        【讨论】:

        • 嘿,我们可以使用任何变量而不是“空白”值,例如 awk -F '|' '{打印匹配($2,/[^]/)? $2 : "$var"}' 文件.txt
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多