【问题标题】:How to add a character end of each variable with awk?如何用awk添加每个变量的字符结尾?
【发布时间】:2016-11-08 18:57:41
【问题描述】:

我有一个制表符分隔文件,我想在每个变量的末尾添加“$”,我可以用 awk、sed 或其他任何东西来做吗?

示例 输入:

a seq1 anot1
b seq2 anot2
c seq3 anot3
d seq4 anot4

我需要这个:

输出:

a$ seq1$ anot1$
b$ seq2$ anot2$
c$ seq3$ anot3$
d$ seq4$ anot4$

任何答案将不胜感激, 谢谢

【问题讨论】:

  • 糟糕,您忘记发布代码了! StackOverflow 旨在帮助人们修复他们的代码。这不是免费的编码服务。任何代码都比没有代码好。元代码甚至可以展示您认为程序应该如何工作,即使您不知道如何编写它。

标签: bash awk sed terminal


【解决方案1】:

仅在 bash 中:

while read line; do echo "${line//$'\t'/\$$'\t'}\$"; done < file

这个骇人听闻的解决方案依赖于两个“特殊”的东西——参数扩展来进行替换,格式扩展来允许标签被解析。

在 awk 中,您可以更安全地处理字段:

awk -F'\t' 'BEGIN{OFS=FS} {for(n=1;n<=NF;n++){$n=$n "$"}} 1' file

这是通过逐行输入每一行并将每个字段替换为自身加上美元符号来实现的。 BEGIN 块确保您的输出将使用与输入相同的字段分隔符。末尾的 1 是“打印当前行”的 awk 简写。

【讨论】:

    【解决方案2】:

    派对迟到了……

    另一个awk 解决方案。使用“$”前缀字段和记录分隔符

    $ awk -F'\t' 'BEGIN{OFS="$"FS; ORS="$"RS} {$1=$1}1' file
    

    【讨论】:

    • 哦,非常好。 +1 微妙之处!
    【解决方案3】:

    使用 sed:

    sed  's/[^ ]*/&$/g' filename
    

    用单词 (&) 后跟 $ 替换任何非空格单词。

    哎呀!你说的标签。您可以将上面的空格替换为“\t”以使用制表符分隔。

    sed 's/[^\t]*/&$/g' filename
    

    实际上,对于制表符或空格,甚至更好:

    sed 's/[^[:blank:]]*/&$/g' filename
    

    【讨论】:

    • 请注意,\t 简写适用于 GNU sed(即大多数版本的 Linux),但它不是通用的。不适用于 OS X、FreeBSD、Solaris 等。您可以使用 bash 的扩展引用来解决这个问题——即$'...'
    【解决方案4】:

    awk 是你的朋友:

    awk '{for(i=1;i<=NF;i++)sub(/$/,"$",$i);print}' file
    

    awk '{for(i=1;i<=NF;i++)sub(/$/,"$",$i);}1' file
    

    样本输出

    a$ seq1$ anot1$
    b$ seq2$ anot2$
    c$ seq3$ anot3$
    d$ seq4$ anot4$
    

    这里发生了什么?

    1. 使用for-loop,我们遍历记录中的所有字段。
    2. 我们使用 awk sub 函数将每条记录 ($i) 的 end 即 (/$/) 替换为 $ 即 ("$")。
    3. 明确使用print 打印记录。数字 1 还表示打印记录的默认操作。

    【讨论】:

      【解决方案5】:
      awk '{gsub(/ /,"$ ")}{print $0 "$\r"}' file
      a$ seq1$ anot1$
      b$ seq2$ anot2$
      c$ seq3$ anot3$
      d$ seq4$ anot4$
      

      会发生什么? 首先用美元符号和新空间替换空格。 最后在回车前插入美元符号。

      【讨论】:

      • 虽然代码通常不言自明,但仅包含代码且没有文字解释的答案会被标记为审核队列。您可以通过添加一两句解释来避免这种情况。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-17
      • 2016-03-26
      • 2021-06-25
      • 2012-12-15
      • 1970-01-01
      • 2019-03-16
      • 1970-01-01
      相关资源
      最近更新 更多