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)
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)