【问题标题】:Need to replace value in new line需要在新行中替换值
【发布时间】:2021-11-26 11:07:00
【问题描述】:

我有以下格式的数据(test.txt)。

x: a
y: b

我需要这种格式的。 (之前的第一件事:是标题,在空格之后的值是数据) (已编辑)

x,y  
a,b 

我可以这样做

cat test.txt | tr ": " '\n'

x
a

y
b

它刚刚出现在新行中。有什么方法可以实现所需的格式?

【问题讨论】:

  • 你想做的动作被称为(矩阵)transposition
  • 这不仅仅是移调。它也改变了输出字段分隔符。
  • 仅供参考!!正如@anubhava 所提到的,它不仅用于转置,还包括在输出中取值时包含字段分隔符,在提到的链接中给出的答案并不涵盖那里的那部分。所以它可以作为参考,但它不是重复的恕我直言。
  • 这能回答你的问题吗? An efficient way to transpose a file in Bash

标签: bash awk sed tr


【解决方案1】:

第一种解决方案:使用您展示的示例,请尝试遵循awk 程序。

awk '
BEGIN{ OFS="," }
{
  for(i=1;i<=NF;i++){
    if(i==1){
      sub(/:$/,"",$i)
    }
    value[i]=(value[i]?value[i] OFS:"")$i
  }
}
END{
  for(i=1;i<=NF;i++){
    print value[i]
  }
}
' Input_file

说明:为上述添加详细说明。

awk '                        ##Starting awk program from here.
BEGIN{ OFS="," }             ##Setting OFS to comma in BEGIN section.
{
  for(i=1;i<=NF;i++){        ##Traversing through all fields here.
    if(i==1){                ##If its first field then do following.
      sub(/:$/,"",$i)        ##Substitute ending colon with NULL in 1st field.
    }
    value[i]=(value[i]?value[i] OFS:"")$i  ##Creating value with index of i and keep appending $i in it.
  }
}
END{                         ##Starting END block from here.
  for(i=1;i<=NF;i++){        ##Traversing through all fields here.
    print value[i]           ##Printing value with index of i here.
  }
}
' Input_file                 ##Mentioning Input_file name here.

第二个解决方案:如果您的 Input_file 每行可以有动态(非固定)数量的字段,请尝试以下操作,这将打印值直到最大数量的字段数.

awk '
BEGIN{ OFS="," }
{
  for(i=1;i<=NF;i++){
    if(i==1){
      sub(/:$/,"",$i)
    }
    value[i]=(value[i]?value[i] OFS:"")$i
  }
  nf=(nf>NF?nf:NF)
}
END{
  for(i=1;i<=nf;i++){
    print value[i]
  }
}
' Input_file

【讨论】:

    【解决方案2】:

    BSD工具rs怎么样:

    # Remove colons
    <infile tr -d : |
    
    # Transpose input
    rs -T           |
    
    # Change the delimiter
    tr -s ' ' ,
    

    This question 它的答案可能会提供一些其他选择。

    【讨论】:

    • 如果您知道某个问题是重复的,请投票关闭它而不是回答它。
    【解决方案3】:

    这可能对你有用(GNU sed):

    sed -E 'sed -E 'N;s/:\s*(.*)\n(.*):\s*/,\2\n\1,/' file
    

    追加以下行并使用模式匹配替换。

    【讨论】:

      【解决方案4】:
      $ cat tst.awk
      BEGIN {
          FS = ": *"
          OFS = ","
      }
      {
          for (i=1; i<=NF; i++) {
              vals[NR,i] = $i
          }
      }
      END {
          for (i=1; i<=NF; i++) {
              for (j=1; j<=NR; j++) {
                  printf "%s%s", vals[j,i], (j<NR ? OFS : ORS)
              }
          }
      }
      

      $ awk -f tst.awk test.txt
      x,y
      a,b
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多