我有“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 doo
,foo: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/.$//'