需要替换新行中的值

Need to replace value in new line

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

x: a
y: b

我需要这种格式的。 (前面的第一件事:是 header,space 之后的值为数据) (已编辑)

x,y  
a,b 

我能做到

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

x
a

y
b

它只是换行。有什么方法可以达到我想要的格式吗?

第一个解决方案: 使用您显示的示例,请尝试执行以下 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

BSD工具怎么样rs:

# Remove colons
<infile tr -d : |

# Transpose input
rs -T           |

# Change the delimiter
tr -s ' ' ,

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

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

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

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

$ 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