【问题标题】:awk print $0 with newline separated column valuesawk 使用换行符分隔列值打印 $0
【发布时间】:2020-04-10 07:17:55
【问题描述】:

输入:

"prefix_foo,prefix_bar"

预期输出:

foo
bar

这就是我到目前为止所做的。

$ echo "PREFIX_foo,PREFIX_bar" | awk '/PREFIX_/{x=gsub("PREFIX_", ""); print $0 }'
foo,bar

我无法弄清楚如何打印由换行符分隔的 foo 和 bar。提前致谢!

编辑:

  • 输入的长度未知,因此可以有两个以上的单词,以逗号分隔。
  • 这个问题更倾向于学习 awk 语言,而不是替代 gnu utils。

【问题讨论】:

    标签: bash awk


    【解决方案1】:

    您可能不需要awk。这是纯 bash 解决方案:

    s="prefix_foo,prefix_bar"
    s="${s//prefix_/}"
    s="${s//,/$'\n'}"
    echo "$s"
    

    foo
    bar
    

    这是同一班轮gnu sed

    sed 's/prefix_//g; s/,/\n/g' <<< "$s"
    

    foo
    bar
    

    【讨论】:

      【解决方案2】:

      编辑:第二个解决方案根据 OP 的 cmets 在此处添加更多通用解决方案,这将查找每个字段并检查其是否具有 prefix 然后它将打印专栏的第二部分(在_ 之后)。

      echo "prefix_foo,etc,bla,prefix_bar" | 
      awk '
      BEGIN{
        FS=OFS=","
      }
      {
        for(i=1;i<=NF;i++){
          if($i~/prefix/){
            split($i,array,"_")
            val=(val?val OFS:"")array[2]
          }
        }
        if(val){
          print val
        }
        val=""
      }'
      

      要在新行中打印输出字段值,请尝试:

      echo "prefix_foo,etc,bla,prefix_bar" | 
      awk '
      BEGIN{
        FS=OFS=","
      }
      {
        for(i=1;i<=NF;i++){
          if($i~/prefix/){
            split($i,array,"_")
            print array[2]
          }
        }
      }
      '
      


      第一种解决方案:对于简单的案例(特定于所示示例),请尝试以下操作。

      awk -F'[_,]' '/prefix_/{print $2,$4}'  Input_file
      

      echo "prefix_foo,prefix_bar" | awk -F'[_,]' '/prefix_/{print $2,$4}'
      

      【讨论】:

      • 感谢您的回答。我们有一个更有趣的答案,它要短得多。 (@Jetchisel)
      • @AbhijeetRastogi,我也这么认为,但是对于示例prefix_foo,etc,bla,prefix_bar,如果您不想要像etc,bla 这样的东西,它也会出现在输出中,这就是我没有选择那个的原因。老实说,如果您只想要那些包含prefix 的字段并且您只想打印那些字段,这将更加通用。
      【解决方案3】:

      刚刚尝试awk

       echo "PREFIX_foo,PREFIX_bar" | awk -F, -v OFS="\n" '{gsub(/PREFIX_/,""); $1=$1}1'
      

      【讨论】:

      • 谢谢!你的命令和我的有什么不同? awk -F, -v OFS="\n" '{gsub(/PREFIX_/, ""); $1=$1 ; print $0}' ?我不完全按照你的命令的语法。感谢您的帮助。
      • 我将输入字段分隔符设置为逗号 , 因此并将输出字段分隔符设置为换行符 "\n" 并删除了 PREFIX_ 就像您使用 gsub 所做的一样。 $1=$1 将所有字段设置为换行符,最后一个 1 表示打印。
      猜你喜欢
      • 1970-01-01
      • 2013-05-23
      • 2015-01-06
      • 2014-04-27
      • 2018-02-19
      • 2011-01-02
      • 2017-08-12
      • 2016-11-27
      相关资源
      最近更新 更多