我有一个文件:
input.txt :
a|400|green|blahblah|big
b|2500|red|text|small
a|1400|blue|something|medium
我希望将其转换为
output.txt (注意不同的引号):
color: "green"; size: "big"; price: 400
color: 'red'; size: 'small'; price: 2500
color: "blue"; size: "medium"; price: 1400
也就是说,正则表达式找到:
^[ab]\|(.*?)\|(.*?)\|.*?\|(.*?)$
并替换为以下内容:
如果一行以a|
开头:
color: "\2"; size: "\3"; price: \1
如果一行以b|
开头:
color: '\2'; size: '\3'; price: \1
如何在Unix命令行,sed,Cygwin或Bash中一次性完成此操作?性能越高越好(那些文件真的很大)
答案 0 :(得分:3)
您可以使用此awk
命令:
awk -F '\\|' -v sq="'" '$1=="a"{q="\""} $1=="b"{q=sq} {
printf "color: %s%s%s; size: %s%s%s; price: %s\n",
q, $3, q, q, $5, q, $2}' input.txt > output.txt
color: "green"; size: "big"; price: 400
color: 'red'; size: 'small'; price: 2500
color: "blue"; size: "medium"; price: 1400
答案 1 :(得分:2)
sed -e "s/^a|/\"/;s/^b|/'/;s/\(.\)\([^|]*\)|\([^|]*\).*|\([^|]*\)/color: \1\3\1; size: \1\4\1; price: \2/" YourFile
posix sed(GNU sed上的--posix
)
答案 2 :(得分:1)
#!awk -f
BEGIN {FS = "|" }
$1 == "a" {z = "\""}
$1 == "b" {z = "'" }
$0 = "color: " z$3z "; size: " z$5z "; price: " $2
像这样跑
foo.awk input.txt > output.txt
答案 3 :(得分:1)
与anubhavas相似,但采用不同的方法,在评论中写一下会有点困难。
显然,这假设只有a
或b
作为第一个字段
awk -F'|' '{q=$1=="a"?"\x22":"\x27"}
{print "color:",q$3q"; size:",q$5q"; price:",$2 }' file
工作原理
将字段分隔符设置为|
根据第一个字段是'
使用它们的十六进制值,将变量q设置为"
或a
然后打印行,引号替换为q
够简单!