【问题标题】:Awk: Drop last record separator in one-linerawk:在单行中删除最后一个记录分隔符
【发布时间】:2016-08-30 21:26:53
【问题描述】:

我有一个简单的命令(bash 脚本的一部分),我正在通过 awk 进行管道传输,但如果不通过管道传输到 sed,似乎无法抑制最终记录分隔符。 (是的,我有很多选择,我的是 sed。)有没有不需要最后一个管道的更简单的方法?

dolls = $(egrep -o 'alpha|echo|november|sierra|victor|whiskey' /etc/passwd \
| uniq | awk '{IRS="\n"; ORS=","; print}'| sed s/,$//);

没有 sed,这会产生像 echo,sierra,victor, 这样的输出,我只是想去掉最后一个逗号。

【问题讨论】:

  • 没有名为“IRS”的 awk 变量。有“RS”,默认情况下它是一个换行符,因此如果这是您的意图,则无需设置它。此外,除非行相邻,否则 uniq 不会检测重复条目,因此最好使用 sort -u 代替,并且 egrep 会提取属于较大字符串的文本 - 这真的是您想要的吗?端到端地告诉我们您要如何处理示例输入和预期输出,我们可以为您提供帮助。
  • = 符号周围不应有空格
  • 感谢有关 IRS 的说明。我有点 awk 菜鸟,真的只用它来处理管道。如果它没有被忽略并且分隔符不是 \n 已经,我将不得不从错误中学习。 :) 我使用的是uniq 而不是sort -u,因为重复的名称来自/etc/passwd 中的一行:首先是用户名,然后是主目录。它们几乎可以保证是连续的。

标签: bash sed awk


【解决方案1】:

你不需要awk,试试:

egrep -o ....uniq|paste -d, -s

这是另一个例子:

kent$  echo "a
b
c"|paste -d, -s
a,b,c

我还认为您的链式命令可以简化。 awk 可以一次性完成所有事情。

【讨论】:

  • 酷,我很久没用粘贴命令了,完全忘记了。这很优雅。谢谢。 N.B.:你的第一个例子有一个错字。 paste -d, s 必须是 paste -d, -s
【解决方案2】:

代替 egrep、uniq、awk、sed 等,所有这些都可以在一个 awk 命令中完成:

awk -F":" '!($1 in a){l=l $1 ","; a[$1]} END{sub(/,$/, "", l); print l}' /etc/password

【讨论】:

    【解决方案3】:

    这是 awk 中的一个小而非常简单的单行代码,它抑制了最终记录分隔符:

    echo -e "alpha\necho\nnovember" | awk 'y {print s} {s=$0;y=1} END {ORS=""; print s}' ORS=","
    

    给予:

    alpha,echo,november
    

    所以,你的例子变成了:

    dolls = $(egrep -o 'alpha|echo|november|sierra|victor|whiskey' /etc/passwd | uniq | awk 'y {print s} {s=$0;y=1} END {ORS=""; print s}' ORS=",");
    

    使用 awk 而不是 paste 或 tr 的好处是这也适用于多字符 ORS。

    【讨论】:

      【解决方案4】:

      既然你把它标记为bash,这是一种方法:

      #!/bin/bash
      
      # Read the /etc/passwd file in to an array called names
      while IFS=':' read -r name _; do 
        names+=("$name"); 
      done < /etc/passwd
      
      # Assign the content of the array to a variable
      dolls=$( IFS=, ; echo "${names[*]}")
      
      # Display the value of the variable
      echo "$dolls"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-04-13
        • 1970-01-01
        • 1970-01-01
        • 2013-01-17
        • 1970-01-01
        • 2017-03-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多