如何在csv中用空格替换逗号,但在每列后插入不同数量的空格?

Ale*_*man 4 command-line sed awk text-processing csv

我有以下格式的文件:

s1,23,789  
s2,25,689
Run Code Online (Sandbox Code Playgroud)

我想将其转换为以下格式的文件:

s1      23  789  
s2      25  689
Run Code Online (Sandbox Code Playgroud)

即第 1 列和第 2 列之间有 6 个空格,第 2 列和第 3 列之间只有 3 个空格?

有没有使用 sed 或 awk 快速解决这个问题的方法?

Ste*_*uch 6

应该这样做:

awk 'BEGIN{IFS=","} {printf("%s      %s   %s\n", $1, $2, $3)}' input_file
Run Code Online (Sandbox Code Playgroud)

同样更简洁(来自评论):

awk -F ',' '{printf("%s      %s   %s\n", $1, $2, $3)}' input_file
Run Code Online (Sandbox Code Playgroud)


Ser*_*nyy 5

AWK

替代 awk sprintf()

$ awk -F ',' '{long=sprintf("%6s"," ");short=sprintf("%3s"," "); print $1long$2short$3 }' input.txt 
s1      23   789  
s2      25   689
Run Code Online (Sandbox Code Playgroud)

以及主题的常规变化printf()

$ awk -F ',' '{printf "%s%6s%s%3s%s\n",$1," ",$2," ",$3}' input.txt                                                      
s1      23   789  
s2      25   689
Run Code Online (Sandbox Code Playgroud)

主题的另一种变体sprintf(),但具有sub()gsub()功能。由于sub()只编辑第一个匹配项,因此我们可以方便地使用它来将第一个逗号替换为 6 个空格,将另一个逗号替换为 3 个空格

$ awk '{sub(/\,/,sprintf("%6s",""));gsub(/\,/,sprintf("%3s",""));};1' input.txt                                          
s1      23   789  
s2      25   689
Run Code Online (Sandbox Code Playgroud)

对于喜欢替代方案的人,这里还有其他方法:

珀尔

$ perl -F',' -lane "print @F[0],' 'x6,@F[1],' 'x3,@F[2]"  < input.txt                                                    
s1      23   789  
s2      25   689
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

SED

$ sed -e 's/,/      /' -e 's/,/   /'  input.txt                                                                          
s1      23   789  
s2      25   689
Run Code Online (Sandbox Code Playgroud)