【发布时间】:2021-04-20 00:46:24
【问题描述】:
我有以下文件-
k11=v11,k12=v12,k13=v13,...,k1N=v1N
k21=v21,k22=v22,k23=v23,...,k2N=v2N
...
...
请注意,键和值可以是字母数字。我想要一种快速生成另一个文件的方法 具有以下内容-
v11,v12,v13,..,v1N
v21,v22,v23,..,v2N
....
我可以使用 sed 或 awk 快速完成此操作吗?
【问题讨论】:
我有以下文件-
k11=v11,k12=v12,k13=v13,...,k1N=v1N
k21=v21,k22=v22,k23=v23,...,k2N=v2N
...
...
请注意,键和值可以是字母数字。我想要一种快速生成另一个文件的方法 具有以下内容-
v11,v12,v13,..,v1N
v21,v22,v23,..,v2N
....
我可以使用 sed 或 awk 快速完成此操作吗?
【问题讨论】:
使用 awk 的另一个选项是使用否定字符类 [^,=]+ 删除除逗号或等号以外的任何字符,或使用 [[:alnum:]]+= 仅匹配字母数字
$ cat file
k11=v11,k12=v12,k13=v13
k21=v21,k22=v22,k23=v23
Awk
awk '
gsub(/[^=,]+=/,"")
' file > output
cat output
输出
v11,v12,v13
v21,v22,v23
【讨论】:
这是一个 awk:
awk -F, '{for (i=1;i<=NF;i++) {
split($i,a,/=/)
printf "%s%s", a[2], (i<NF ? FS : ORS)
}
}' file > new_file
【讨论】:
使用 GNU sed:
sed -r 's/(^|,)[^=]+=/\1/g'
解释:
(^|,) 表示行的开头 (^) 或逗号。由于括号,它存储在寄存器 #1 中。[^=]+= 表示由除等号 ([^=]) 以外的任何字符组成的字符串,至少有一个字符长 (+),并紧跟等号s/.../\1/) 的内容替换。实际上,这会删除第二部分g 标志会根据需要重复操作更短的形式:sed -r 's/[^,=]+=//g'
POSIX 友好,如果您没有 GNU sed:sed 's/[^,=]\+=//g'
【讨论】:
perl -pe 's/\w+=//g' file.csv