在键值对中添加自定义分隔符

在键值对中添加自定义分隔符

我有“Key:value”形式的数据(901 S 902 M 905 F 906 WAPENC 907 31 908 371 909 38765469947/TYPE=PLMN 等等),其中键是 901,902,905,906.....等等,各自的值是空格 S、M、F、WAPENC、31... 等之后。

输入示例

901 S 902 M 905 F 906 WAPENC 907 31 908 371 909 38765469947/TYPE=PLMN ..... continuous data

我想转换成 key:value,key:value... 格式。

期望的输出:

901:S,902:M,905:F,906:WAPENC,907:31,908:371,909:38765469947/TYPE=PLMN and so on .....

尝试使用 perl 和 sed 但没有得到预期的结果

答案1

另一个awk解决方案:

awk '{
  for (i=1; i<=NF; i++)
    printf $i (i==NF ? ORS : (i%2 ? ":" : ",")) 
}' file

测试:

$ printf 'a\na b\na b c\na b c d\n' | awk '{
  for (i=1; i<=NF; i++)
    printf $i (i==NF ? ORS : (i%2 ? ":" : ",")) 
}'
a
a:b
a:b,c
a:b,c:d

答案2

像这样吗?

% perl -pe 's/(\S+) (\S+) ?/$1:$2,/g; s/,$//' file.txt
901:S,902:M,905:F,906:WAPENC,907:31,908:371,909:38765469947/TYPE=PLMN

或者

% sed -E -e 's/([^ ]+) ([^ ]+) ?/\1:\2,/g; s/,$//' file.txt
901:S,902:M,905:F,906:WAPENC,907:31,908:371,909:38765469947/TYPE=PLMN

两者基本上都是说采用一串非空格、一个空格、另一串非空格和一个可选空格;然后用逗号和冒号将捕获的非空格字符串放回原处。然后从行尾删除最后一个冒号逗号。如果末尾有奇怪的字段,它将保持原样。即输入foo bar doo将变成foo:bar,doo.

或者在 AWK 中,循环遍历字段:

% awk '{ for (i=1; i <= NF; i+=2) {printf "%s:%s", $i, $(i+1); if (i <= NF - 2) printf "," }; printf "\n" }' file.txt
901:S,902:M,905:F,906:WAPENC,907:31,908:371,909:38765469947/TYPE=PLMN

(这将变成foo bar doofoo:bar,doo:在末尾添加杂散的逗号冒号。)

答案3

这可以使用 tr 和 sed 命令来实现,如下所示:

$ tr ' ' '\n' < infile.txt | sed '1~2s/$/:/' | sed '2~2s/$/,/' | tr -d '\n'

901:S,902:M,905:F,906:WAPENC,907:31,908:371,909:38765469947/TYPE=PLMN,

解释

第一个 tr 每行放置一个项目

第一个 sed 将冒号添加到从第 1 行开始的每隔一行的末尾

第二个 sed 在从第 2 行开始的每隔一行的末尾添加一个逗号

最后一个 tr 删除所有行尾以像以前一样创建长数据字符串

要去掉最后一个逗号,请使用另一个 sed:

sed 's/.$//'

相关内容