(sed/awk)如何将字段分隔(如csv)文件转换为具有固定大小的制表符分隔列的txt?

Man*_*uel 3 csv format awk sed

我有类似csv文件的东西,其中字段分隔符是"@".

ID @名称@姓@时代@职业@地址

1254343123@John@Smith@24@Engineer@Washington
23@Alexander@Kristofferson-Brown@Economic Advisor@Kent
...

我想把它转换成人类可读的东西,如:

1254343123    John        Smith                  24    Engineer            Washington
23            Alexander   Kristofferson-Brown    35    Economic Advisor    Kent

...每个栏目都以特定角色出现.

我尝试了一些利用TAB-size值的东西,并在该字段中添加了几个TAB:

sed -e "{/@[^@]\{32,\}@/s/@\([^@]*\)@/\t\1\t/g};{/@[^@]\{24,31\}@/s/@\([^@]*\)@/\t\1\t/g};{/@[^@]\{16,23\}@/s/@\([^@]*\)@/\t\1\t\t/g};{/@[^@]\{8,15\}@/s/@\([^@]*\)@/\t\1\t\t/g};{/@[^@]\{2,7\}@/s/@\([^@]*\)@/\t\1\t\t\t/g}"
Run Code Online (Sandbox Code Playgroud)

......在所有情况下都不起作用.

有人可以给我一个暗示如何继续吗?

PS:我的意图是主要使用sed(一个单行)或者如果sed只是没有削减它,awk就可以了.

Fre*_*Foo 17

BSD,Mac OS X和Linux都有这样的column命令:

column -t -s@
Run Code Online (Sandbox Code Playgroud)

它产生空间,而不是制表符(它应该,因为制表符已过时).输出:

1254343123  John       Smith                24  Engineer          Washington
23          Alexander  Kristofferson-Brown  35  Economic Advisor  Kent
Run Code Online (Sandbox Code Playgroud)


Sie*_*geX 6

awk -F@ '{for(i=1;i<=NF;i++){printf "%-20s", $i};printf "\n"}' input.csv
Run Code Online (Sandbox Code Playgroud)

输入

$ cat input.csv
1254343123@John@Smith@24@Engineer@Washington
23@Alexander@Kristofferson-Brown@35@Economic Advisor@Kent
Run Code Online (Sandbox Code Playgroud)

产量

$ awk -F@ '{for(i=1;i<=NF;i++){printf "%-20s", $i};printf "\n"}' input.csv
1254343123          John                Smith               24                  Engineer            Washington
23                  Alexander           Kristofferson-Brown 35                  Economic Advisor    Kent
Run Code Online (Sandbox Code Playgroud)

如果你想使字段宽度(上面代码中的20)一个可以传入的shell变量,你可以这样做:

#!/bin/bash

fldwth=20

awk -v fw=$fldwth -F@ '{for(i=1;i<=NF;i++){printf "%-*s", fw,$i};printf "\n"}' input.csv
Run Code Online (Sandbox Code Playgroud)