【问题标题】:Using sed awk how to change column1 with other columns and other columns with column1使用 sed awk 如何将 column1 与其他列和其他列与 column1 一起更改
【发布时间】:2014-10-09 19:05:22
【问题描述】:

使用 sed / awk 或任何 Linux 命令单行,如何在不使用 Perl/其他工具的情况下更改以下行。

来自

1:is is is is is is
2:is is
3:is
4:is

is:1,1,1,1,1,1
is:2,2
is:3
is:4

【问题讨论】:

  • 你觉得应该怎么做?
  • 只需修复任何类似 grep 的工具正在生成您不想要的输出,而不是生成您想要的输出。

标签: replace awk grep reverse substitution


【解决方案1】:

这是一个快速而肮脏的方法:

awk '
BEGIN { FS = OFS = ":" }
{
    sep = "";
    n = split ($2, t, / /); 
    $2 = ""; 
    for (i=1; i<=n; i++) {
        $2 = $2 sep $1; 
        sep=","
    }
    $1 = t[1]
}1' file
is:1,1,1,1,1,1
is:2,2
is:3
is:4

【讨论】:

    【解决方案2】:

    查看您以前的帖子,我认为这就是您真正想要的:

    $ cat file
    This is a file, my name is Karl, what is this process, karl is karl junior, file is a test file, file's name is file.txt
    My name is not Karl, my name is Karl Joey
    What is your name?
    Do you know your name and what it is?
    
    $ awk -v tgt="is" '
    BEGIN { FS = "(^|[^[:alpha:]])" tgt "([^[:alpha:]]|$)" }
    NF>1 {
        printf "%s:", tgt
        for (i=2; i<=NF; i++)
            printf "%s%s", NR, (i<NF?",":ORS)
    }' file
    is:1,1,1,1,1,1
    is:2,2
    is:3
    is:4
    

    如果您有 GNU awk,则可以使用 \\&lt;\\&gt; 代替 (^|[^[:alpha:]])([^[:alpha:]]|$)

    您应该在示例输入和预期输出中包含Is 行(混合大小写),以向我们展示您的脚本是否应该区分大小写。以上是区分大小写的,如果您不想将其更改为:

    $ awk -v tgt="is" '
    BEGIN { FS = "(^|[^[:alpha:]])" tolower(tgt) "([^[:alpha:]]|$)" }
    { $0 = tolower($0) }
    NF>1 {
        printf "%s:", tgt
        for (i=2; i<=NF; i++)
            printf "%s%s", NR, (i<NF?",":ORS)
    }' file
    

    请注意,这只是 @jaypal 对您之前的问题 https://stackoverflow.com/a/25336554/1745001 给出的 gawk 特定答案的变体。

    【讨论】:

      【解决方案3】:

      这个单线怎么样:

      awk -F':' -v OFS=":" '{t=$1;split($2,a," ");$1=a[1];gsub(/[^ ]+/,t,$2)}7' file
      

      编辑

      哦,我没注意到你想用逗号分隔字段:

      awk -F':' -v OFS=":" '{t=$1;split($2,a," ");$1=a[1];
                            gsub(/[^ ]+ /,t",",$2);sub(/[^,]*$/,t,$2)}7' file
      

      【讨论】:

        【解决方案4】:

        应该这样做:

        awk -F":| " '{printf "%s,",$2;for(i=2;i<NF;i++) printf "%s,",$1;print $1}' file
        is,1,1,1,1,1,1
        is,2,2
        is,3
        is,4
        

        【讨论】:

          猜你喜欢
          • 2019-09-15
          • 2014-10-01
          • 2021-12-03
          • 1970-01-01
          • 1970-01-01
          • 2021-07-26
          • 2017-07-24
          • 1970-01-01
          • 2022-07-12
          相关资源
          最近更新 更多