我有一个以下格式的文件:
s1,23,789
s2,25,689
我想将其转换为以下格式的文件:
s1 23 789
s2 25 689
即第一列和第二列之间有 6 个空格,第二列和第三列之间只有 3 个空格?
有没有一种快速的方法可以使用 sed 或 awk 来完成这个任务?
答案1
沿着这些思路的事情应该做到这一点:
awk 'BEGIN{IFS=","} {printf("%s %s %s\n", $1, $2, $3)}' input_file
同样,更简洁(来自评论):
awk -F ',' '{printf("%s %s %s\n", $1, $2, $3)}' input_file
答案2
AWK
替代 awk sprintf()
:
$ awk -F ',' '{long=sprintf("%6s"," ");short=sprintf("%3s"," "); print $1long$2short$3 }' input.txt
s1 23 789
s2 25 689
以及主题的常规变化printf()
:
$ awk -F ',' '{printf "%s%6s%s%3s%s\n",$1," ",$2," ",$3}' input.txt
s1 23 789
s2 25 689
主题的另一种变体sprintf()
,但具有sub()
和gsub()
功能。由于sub()
只编辑第一个匹配项,因此我们可以方便地使用它来将第一个逗号替换为 6 个空格,将另一个逗号替换为 3 个空格
$ awk '{sub(/\,/,sprintf("%6s",""));gsub(/\,/,sprintf("%3s",""));};1' input.txt
s1 23 789
s2 25 689
对于喜欢替代方案的人,这里还有其他方法:
珀尔
$ perl -F',' -lane "print @F[0],' 'x6,@F[1],' 'x3,@F[2]" < input.txt
s1 23 789
s2 25 689
Python
$ python -c 'import sys;lines=[l.strip().split(",") for l in sys.stdin];print "\n".join([ i[0]+" "*6+i[1]+" "*3+i[2] for i in lines])' < input.txt
s1 23 789
s2 25 689
SED
$ sed -e 's/,/ /' -e 's/,/ /' input.txt
s1 23 789
s2 25 689