【问题标题】:awk script read line matching a pattern and result output with comma separatedawk 脚本读取与模式匹配的行,结果输出用逗号分隔
【发布时间】:2017-09-16 02:19:37
【问题描述】:

帮助 shell 脚本以逗号分隔的行读取模式,最终结果输出应再次以逗号分隔。在下面的例子中,读取以逗号分隔的行并再次输出以逗号分隔的木偶字符串。

echo "docker-one,puppet-one,puppet-two,docker-three,puppet-four" | script

需要输出:

docker-one,docker-three

【问题讨论】:

  • 你试过的代码在哪里?这是相当基本的东西......
  • IFS="," for v in $variable;回声 $v | grep -v 木偶;完成
  • 但是需要用逗号分隔输出
  • 您的问题不清楚。您打印 docker 字段是因为它们包含 docker 还是因为它们不包含 puppet?请修复output only puppet strings 说出你真正的意思。你真的只有 1 行输入吗?您真的希望从管道中读取它,还是想要一个可以对此类行的文件进行操作的脚本,或者它可以是一个解析作为参数传递的值而不是从管道传递的值的脚本?

标签: bash shell awk sed cut


【解决方案1】:

使用本机 bash 正则表达式运算符 ~ 并使用 GNU paste 单独格式化 csv

IFS="," read -ra myArray <<<"docker-one,puppet-one,puppet-two,docker-three,puppet-four"
for i in "${myArray[@]}";do [[ $i =~ ^puppet ]] && echo "$i" ; done | paste -sd ','

产生一个输出

puppet-one,puppet-two,puppet-four

对于以puppet 开头的字符串以外的其他字符串,进行负正则表达式匹配,

for i in "${myArray[@]}";do [[ ! $i =~ ^puppet ]] && echo "$i" ; done | paste -sd ','
docker-one,docker-three

【讨论】:

    【解决方案2】:

    使用 tr、grep 和粘贴:

    $ echo "docker-one,puppet-one,puppet-two,docker-three,puppet-four" \
           | tr , '\n' | grep -v puppet | paste -s -d , -
    docker-one,docker-three
    

    【讨论】:

      【解决方案3】:

      听起来其中之一可能是您正在寻找的:

      $ echo "docker-one,puppet-one,puppet-two,docker-three,puppet-four" |
      awk -F, '{for (i=1;i<=NF;i++) if ($i ~ /puppet/) printf "%s%s", (c++?FS:""), $i; print ""}'
      puppet-one,puppet-two,puppet-four
      
      $ echo "docker-one,puppet-one,puppet-two,docker-three,puppet-four" |
      awk -F, '{for (i=1;i<=NF;i++) if ($i !~ /puppet/) printf "%s%s", (c++?FS:""), $i; print ""}'
      docker-one,docker-three
      
      $ echo "docker-one,puppet-one,puppet-two,docker-three,puppet-four" |
      awk -F, '{for (i=1;i<=NF;i++) if ($i ~ /docker/) printf "%s%s", (c++?FS:""), $i; print ""}'
      docker-one,docker-three
      

      【讨论】:

        【解决方案4】:

        awk 来救援!

        echo "docker-one,puppet-one,puppet-two,docker-three,puppet-four" | 
        awk 'BEGIN{RS=ORS=","} /puppet/'
        
        puppet-one,puppet-two,puppet-four
        

        用于 docker,并替换最后一个逗号

        echo "docker-one,puppet-one,puppet-two,docker-three,puppet-four" | 
        awk 'BEGIN{RS=ORS=","} /docker/' | 
        sed 's/,$/\n/'
        
        docker-one,docker-three
        

        或者,如果你的意思是非傀儡

        echo "docker-one,puppet-one,puppet-two,docker-three,puppet-four" | 
        awk 'BEGIN{RS=ORS=","} !/puppet/' | 
        sed 's/,$/\n/'
        
        docker-one,docker-three
        

        【讨论】:

        • 抱歉,预期输出“docker-one,docker-three”
        • 如果最后一个字符串不包含 puppet,则会在输出末尾产生一个没有后续换行符的逗号。
        • 当您生成不以换行符结尾的文本时,它不再是 POSIX“文件”,因此任何后续命令(例如 sed)可能会将其作为输入执行未定义的行为,因此 YMMV 与试图用管道更正它到另一个命令。
        猜你喜欢
        • 1970-01-01
        • 2015-04-08
        • 1970-01-01
        • 2011-08-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-12
        相关资源
        最近更新 更多