需要替换新行中的值
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
我有以下格式的数据 (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